2012-11-09 30 views
2

因此,我在我的應用程序中使用了一個相當標準的嵌套模型實現的頁面,沿着標準Customer - > Order - > OrderLineItems類型的行。對我來說差別在於OrderLineItems的模型非常複雜。Knockoutjs - 調用valueHasMutated太頻繁?

在我的代碼中,爲了正確地更新我的視圖,我發現我調用了「myObservable.valueHasMutated()」很多東西,它們都帶有可觀察數組和可觀察對象。

這是一種直覺,不得不手動做這件事 - 但我不確定在哪裏可以知道可能需要改變的地方。所以有幾個問題:

  1. 這是「深/大」模型的正常嗎?
  2. 有沒有什麼明顯的我可能會尋找解決這個問題?
  3. 在KO上實現的這種複雜模型的Web上是否有示例?

什麼,我有我的視圖模型的一個例子:

self.projectsVisible = ko.observable(false); 
self.toggleProjectVisibility = function() { 
    self.projectsVisible(!self.projectsVisible()); 
    self.projectsVisible.valueHasMutated(); 
}; 

這是綁在按鈕元素和DIV:

<div data-bind="visible: projectsVisible"> 
    <table> 
     <thead data-bind="template: {name: 'projectHeader'}"></thead> 
     <tbody data-bind="template: {name: 'project', foreach: projects}"></tbody> 
    </table> 
</div> 
<button type="button" data-bind="click: toggleProjectVisibility"> 
    Toggle Projects On/Off 
</button> 
+5

也許你可以在jsFiddle中找到顯示問題的東西?很少有你需要自己調用'valueHasMutated'的情況。一般來說,當您直接修改一個observable/observableArray包含的對象/數組並且想要觸發更新或創建訂閱並希望立即觸發它時,會使用這種方法。你在切換布爾值的情況下不需要它。我認爲一個jsFiddle會幫助我們縮小範圍。 –

+0

我有類似的問題。 JSFiddle在這裏:http://jsfiddle.net/b22Ex/2/ 在這個問題,http://stackoverflow.com/questions/15798881/kogrid-update-cell它有人建議,我叫valueHasMutated()爲了我的更改才能生效。 – krasnaya

回答

0

我用valueHasMutated主要用於observableArray變化。

在您的示例中,self.projectsVisible(!self.projectsVisible());已通知訂戶,因爲值始終更改。因此,致電valueHasMutated通知用戶第二次進行相同的值更改。

您可以檢查此琴:http://jsfiddle.net/5RU7n/

在要上觀察的通知write操作的用戶的情況下,即使當值保持不變,則可以使用.extend({ notify: 'always' })擴展(見http://knockoutjs.com/documentation/observables.html)。

最後,我想你可以嘗試列舉你撥打valueHasMutated的情況,最後你可能會自己找到多餘的電話。