2013-12-10 89 views
1

我遇到了Knockout的問題,這似乎有點令人費解。KnockoutJS不更新視圖

我有一個聯繫人列表,我想綁定到UI(observableArray)。
但是,我不需要項目本身每個都是可觀察的,因爲它們只通過對話框更新,我不需要單獨跟蹤每個字段。

我有以下的jsfiddle來證明我的問題:

http://jsfiddle.net/EsgGg/12/

var c = contacts()[0]; 
c.name="James"; 
contacts.splice(0, 1, c); 
// the contacts observableArray is now correct but the UI is unchanged 

出於某種原因,拼接方法不更新視圖?

在此先感謝。

我真的認爲Knockout應該允許觸發器('change')或其他一些observables方法來使這種類型的事情更容易。

回答

2

基因敲除對可觀察物具有變化觸發。這就是所謂的valueHasMutated()

contacts.valueHasMutated(); 

但實際上你是更好,如果每次在屏幕上顯示(並受偶然變化)值是在您的視圖模型的實際觀測。

contacts()[0].name("James"); // done 
+0

感謝您提供該方法。 映射每個字段的問題是使用JSON從服務器更新它們要困難得多。另外,爲什麼要監控這些值,如果它們永遠不會單獨更改 1.打開編輯對話框(jQueryUI) 2.將聯繫人的值複製到窗體裏面對話框 3.當保存按鈕被點擊時,將表單值讀入JS對象 4.替換聯繫人列表中的條目。 #4的另一種方式是 遍歷每個JS屬性,並每次調用頁面上的渲染時調用可觀察的 。 – DavidMedlock

+2

這就是爲什麼[映射插件](http://knockoutjs.com/documentation/plugins-mapping.html)。只需很少的努力,它可以完成您想要的所有映射。它甚至可以映射一半的JSON,如果你配置它的話。如果你想更新服務器,它還會處理所有的事情。 – Tomalak

+0

你擊敗了我對映射插件的評論。 @DavidMedlock,你不需要在你的評論中的步驟#2可觀察到的屬性?如果屬性不可觀察,那麼knockout將如何知道表單文本框中的值已更改,並相應地更新viewmodel中的屬性? – danludwig