2013-03-20 52 views
3

HTMLKnockout.js applyBindings兩次重複結果

<table cellpadding="0" cellspacing="0" border="0"> 
<thead> 
    <tr><th width="483"><span>Product Name</span></th></tr> 
</thead> 
<tbody data-bind='foreach: basket.model.products()'> 
    <tr><td><div class="ml10 productDetails" data-bind="text: name"></div></td></tr>    
</tbody> 
</table>  

JavaScript代碼

var ProductLine = function(data) { 
    var self = this; 
    self.name   = ko.observable(data.name); 

}; 

function BasketModel(data) { 
    var self    = this;      
    self.initialData  = ko.observable(data);  
    self.products   = ko.observableArray(); 

    $.each(self.initialData().products,function(i,val){ 
     self.products.push(new ProductLine(this)); 
    }); 
} 
function renderBasket(data){   

    basket = { model: new BasketModel(data)}; 
    ko.applyBindings(basket.model); 
} 
$(document).ready(function(){ 
    var sampleData = [{"name":"product 1"},{"name":"product 2"}]; 
    renderBasket(sampleData); 
}); 

在i AJAX交內增加一個新的產品籃,我調用下面的功能與響應數據

renderBasket(response.data); 

示例響應數據如 [{「name」:「product 1」},{「name」:「product 2」},{ 「name」:「product 3」}];

起初: 錶行是這樣的:

product 1 
product 2 
product 3 

後,我添加一個新的產品 結果是:

product 1 
product 1 
product 1 
product 2 
product 2 
product 2 
product 3 
product 3 
product 3 

我試過ko.cleanNode和basket.model.products .removeAll()在ko.applyBindings(basket.model)之前; 但我解決不了。

謝謝。

+0

當我在「ajax發佈成功」上做了這件事,它工作。但我認爲這不應該是真正的解決方案。 basket.model.products.removeAll(); \t \t \t \t \t \t \t \t \t \t \t \t $。每個(ajaxCevap.data.products,功能(I,VAL){ \t \t \t \t \t \t \t basket.model.products.push(新PRODUCTLINE(這個)); \t \t \t \t \t \t}); – 2013-03-20 23:24:25

+1

你永遠不應該調用'applyBindings'兩次,除非你知道自己在做什麼(幾乎所有的標準用例都不需要),否則不應該調用'cleanNode'。這個問題每個月至少要問一次。請通過[Knockout教程](http://learn.knockoutjs.com/) – Tyrsius 2013-03-20 23:31:38

回答

5

您只能撥打ko.applyBindings一次(從$(document).ready函數)。只要將產品推到observableArray上,你就可以走了。

查看http://jsfiddle.net/yCBJ8/5/的完整示例。

var ProductLine = function (data) { 
     var self = this; 
     self.name = ko.observable(data.name); 
    }, 
    BasketModel = function (data) { 
     var self = this; 

     self.products = ko.observableArray(); 

     self.addToBasket = function (d) { 
      $.each(d, function (i, v) { 
       self.products.push(new ProductLine(this)); 
      }); 
     }; 

     self.replaceBasket = function (d) { 
      self.products.removeAll(); 
      self.addToBasket(d); 
     }; 

     self.addToBasket(data); 
    }; 

$(document).ready(function() { 
    var initialData = [{"name": "product 1"}, {"name": "product 2"}], 
     basket = { 
      model: new BasketModel(initialData) 
     }; 

    ko.applyBindings(basket.model); 
}); 
+0

對象[對象對象]的錯誤addToBasket不是函數。但我明白了,非常感謝。 – 2013-03-20 23:55:33

+0

運行小提琴時我看不到錯誤? – mhu 2013-03-21 00:02:08

+0

是的,它的工作原理。沒問題。對不起:)謝謝你。 – 2013-03-21 00:09:27