2013-02-01 27 views
2

我使用knockoutjs並嘗試設置一個項目,包括ko.mapping和一個observableArray的自定義更新綁定。當直接設置值時,更新綁定觸發一次,當使用ko.mapping.fromJS時,更新綁定觸發兩次。請參見下面Fiddle或代碼:爲什麼在使用ko.mapping和observableArray時更新綁定會觸發兩次?

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript" src="knockout-2.2.1.js"> </script> 
    <script type="text/javascript" src="knockout.mapping.js"></script> 
</head> 
<body> 
    <div data-bind="foreach: ObservableArray, updateBinding: ObservableArray"> 
     <span data-bind="text: Value"></span> 
    </div> 
    <script type="text/javascript"> 
     ko.bindingHandlers['updateBinding'] = { 
      init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
       console.log("Binding Handler (Init)"); 
      }, 
      update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
       console.log("Binding Handler (Update)"); 
       var data = ko.utils.unwrapObservable(valueAccessor()); 
      } 
     }; 

     function MainViewModel() { 
      var self = this; 

      self.ObservableArray = ko.observableArray(); 
     } 

     var viewModel = new MainViewModel(); 

     // Fires Init + Update for ObservableArray 
     ko.applyBindings(viewModel); 

     // Setting directly fires Update for ObservableArray once 
     viewModel.ObservableArray([{ "Value": "Lucky Luke" }]); 

     // Setting via mapping fires Update for ObservableArray twice 
     ko.mapping.fromJS({ "ObservableArray": [{ "Value": "Ludwig van Beethoven" }] }, {}, viewModel); 
    </script> 
</body> 
</html> 
+0

我不確定你在做什麼,但這不會發生在我身上。你可以發佈一個可以複製你所看到的問題的小提琴嗎? http://jsfiddle.net/tyrsius/Sgsh6/ – Tyrsius

+2

在您向我們展示您的標記之前,我們無法給您一個合理的答案。您的標記中可能還有其他因素會導致這種情況發生。 –

+0

我修改了樣本(之前的確是錯誤的),並儘可能簡單地重現我的問題。 – Dresel

回答

2

這是由包埋於常規對象陣列時,現在固定的(見github)knockout.mapping的錯誤。

+0

今天我也得到了同樣的體驗,所以不知道它的固定。 –

+0

我的小提琴示例(http://jsfiddle.net/edNCJ/)正在使用一個新的knockout.mapping版本。 – Dresel

+0

我發現我的問題是在ajax.post調用,我沒有給它JSON數據,這導致一個錯誤,觸發它以某種方式再次嘗試。 –

0

你並不需要使用全功能調用語法在您的updateBinding結合,因爲它不是一個表達式。

updateBinding: People().Records() 

應該是:

updateBinding: People().Records 

調整了位:http://jsfiddle.net/twRFf/3/

+0

這就是我不確定的部分 - 爲什麼更新綁定在離開括號時未在fromJS觸發 - 爲什麼它使用括號觸發?映射插件是否會覆蓋dom綁定到的初始視圖模型?我怎麼能阻止這種情況? – Dresel

+0

嘗試不使用映射插件。它不是沒有問題。 – WiredPrairie

+0

我必須在更新綁定內部創建依賴關係,否則knockoutjs將不會觸發它(請參閱http://stackoverflow.com/a/14716216/1249506)。然而,問題保持不變 - 我試圖學習和理解映射插件,手動映射不是一個選項:) – Dresel

相關問題