2012-02-16 11 views
6

verileri yenilenmiyor. Sonra verileri değiştiririm, sunucuya geri gönderirim. Daha sonra, görünümümü herhangi bir değişiklikle yenileyeceğini umarak verilerin yeni bir kopyasını alırım. Ancak bu gerçekleşmez. TIAKnockout.js ko.mapping.toJS ben sunucudan bir json nesnesi getir ve benim görünümü doldurmak Bence

$(document).ready(function() { 
    var customer_id = get_customer_id(); 
    var data = load_model(); 
    contract_model = ko.mapping.fromJS(data,{}); 
    ko.applyBindings(contract_model); 
} 

function load_model(){ 
    var url = '/ar/contract_json?contract_id='+get_contract_id(); 
    var data = ''; 
    $.ajax({ 
     type:'GET', 
     url:url, 
     async:false, 
     success: function(returningValue){ 
      data = returningValue; 
     } 
    }); 
    return data; 
} 

Bu ilk yükleme iyi çalışıyor. Daha sonra bazı şeyler yaparım ve gözlenebilirlerden birini değiştiririm ve bu verileri sunucuya geri gönderirim. Sunucu güncellemesini alır ve sonra daha da görünüm yenilenir böylece yeni (i tek adımda yeni veri geri geçebilir biliyorum ama bu kodda ben henüz refactored değil) veri getirme yapmak.

function refresh_data(contract_model){ 
    var url = '/ar/contract_json?contract_id='+get_contract_id(); 
    $.post(url,function(data){ 
     console.log(data); 
     ko.mapping.fromJS(contract_model,{},data); 
     ko.applyBindings(contract_model); 
     console.log(ko.mapping.toJS(contract_model)) 
    }); 

} 

function refresh_data(contract_model){ 
    var url = '/ar/contract_json?contract_id='+get_contract_id(); 
    $.post(url,function(data){ 
     console.log(data); 
     ko.mapping.fromJS(contract_model,{},data); 
     console.log(ko.mapping.toJS(contract_model)) 
    }); 

} 

function push_model(contract_model,refresh){ 
    var url = '/ar/update_contract'; 
    var data = {'contract':ko.mapping.toJSON(contract_model)} 

    delete data['lines']; 
    $.post(url,data,function(return_value){ 
     if (refresh){ 
      refresh_data(contract_model); 
     }; 
    }); 
} 

Konsol iletilerinin tümü, geri gelen yeni verileri gösterir, ancak görünümüm hiçbir zaman güncellenmez.

cevap

20

Sorunun, contract_model numaralı güncelleştirmeyi güncelleştirirken ko.mapping.fromJS işlevine ilettiğiniz parametreler sırasına göre olduğuna inanıyorum.

Şu ana kadar:

ko.mapping.fromJS(contract_model,{},data); 

İstediğiniz: seth.miller cevabı doğrudur

ko.mapping.fromJS(data, {}, contract_model); 
+12

Mapping eklentisi için KnockOut belgeleri, IMO, ko.mapping.fromJS (...) çağrısının sözdiziminde yanlıştır. Dokümanlar aşağıdakileri gösterir: ko.mapping.fromJS (data, viewModel), ama açıkça şunu içermelidir: ko.mapping.fromJS (data, {}, viewModel) –

+1

Bunun için harcanan saatler. Teşekkürler bu büyük bir yardım oldu. –

+0

Ayrıca saatlerce çalıştım. Size bir altı paket borçluyum – stackoverfloweth

2

@. contract_model, daha önce eşlenmiş olanla aynı ise, ortadaki "seçenekler" parametresini de dışarıda bırakabilirsiniz. Yalnızca iki bağımsız değişken varsa, ko.mapping.fromJS ikinci bağımsız değişkenin bir "__ko_mapping__" özelliğine sahip olup olmadığını kontrol eder. Eğer öyleyse, bunu bir hedef olarak ele alır, aksi takdirde onu bir seçenek nesnesi olarak ele alır.

+0

Ugh bu aptalca. Eğer ikinci argüman '__ko_mapping __ '' özelliğine sahip değilse ve üçüncü argüman mevcut değilse, o zaman ikinci argümanı hedef olarak ele almalıdır. –

0

@ DBueno'nun gözlemine dayanarak - yazı dizini kullanan herkes için knockout.mapping.d.ts dosyanızdan bu aşırı yüklemeyi yorumlamanızı öneririz.

fromJS(jsObject: any, targetOrOptions: any): any; 

enter image description here

yapmanız denerseniz sonra bir derleme zamanı hatası alırsınız:

ko.mapping.fromJS(item.data, item.target); 

ve daha güvenli ile değiştirebilirsiniz

ko.mapping.fromJS(item.data, {}, item.target); 

Daha güvenlidir, çünkü item.target önceden eşlenmiş olup olmadığı (ve dolayısıyla ave a __ko_mapping__ özelliği) her zaman özellikleri kopyalayacaktır.