2015-03-25 87 views
0

我想要代表多個選擇與從後端JSON選擇的值來淘汰視圖模型。 當每次選擇被更改時都需要檢索這個JSON - 第一次 - 一切正常,但如果我再次應用映射(ko.mapping.fromJS(test_data,ViewModel)),所有訂閱都會丟失嗎?是否有人知道如何避免這個情況?從服務器挖掘映射數據,丟失訂閱

的jsfiddle(我不知道爲什麼選擇沒有它的價值,沒有的jsfiddle - 一切正常): http://jsfiddle.net/0bww2apv/2/

$(ViewModel.attributes()).each(function(index, attribute) { 
    attribute.attribute_value.subscribe(function(name) { 
     console.log('SUBSCRIBE', name); 

     var send_data = {}; 
     $(ViewModel.attributes()).each(function (index, attribute) { 
      send_data[attribute.attribute_name.peek()] = attribute.attribute_value.peek(); 
      if (attribute.attribute_value() === null) { 
       send_data = null; 
       return false; 
      } 
     }); 

     if (send_data) { 
      console.log('REQUEST TO BACKEND: ', ko.toJSON(send_data)); 
      ko.mapping.fromJS(test_data, ViewModel); 

      // subscriptions is lost here ! 
     } 
    }); 
}); 
+0

試試這個http://jsfiddle.net/supercool/0bww2apv/4/讓我知道只是在情況。乾杯 – 2015-03-25 10:12:55

+0

argh,參數順序,謝謝...訂閱現在保留,但映射不能按預期工作,每個選擇的更新應該重置所有選擇值,換句話說,每個更改都應該將所有選擇重寫爲初始數據,我已經添加幾個console.log,你可以在數據前後看到,還有「attribute_value」被放置到錯誤的觀察對象(但是第一次讀取可以,奇怪)。 http://jsfiddle.net/0bww2apv/7/ – xwild 2015-03-26 03:40:30

回答

0

最後,我已經解決了我的問題與knockout.reactor插件, 如果我們去掉所有的輔助結構,它看起來像:

var ViewModel = ko.mapping.fromJS(test_data); 

ko.applyBindings(ViewModel); 

ko.watch(ViewModel, { depth: -1 }, function(parents, child, item) { 
    // here we need to filter watches and update only when needed, see jsfiddle 
    ko.mapping.fromJS(test_data2, {}, ViewModel); 
}); 

這樣,我們更新選擇並沒有與訂閱遞歸的麻煩。

完整版(詳情請參見控制檯輸出):http://jsfiddle.net/r7Lo7502/