2017-02-20 22 views
1

我有一個ViewModel在knockout.js個人信息。 我希望javascript認爲整個PersonViewModel如果只是該模型中的單個可觀察屬性發生更改而更改。如何通過改變其可觀察屬性來知道knockout.js ViewModel中的更改?

我也有另一個ViewModel的地址,我想它一樣。 作爲程序的最終用戶,我希望程序通過任何可觀察屬性中的更改來判斷哪個視圖模型發生了更改。

我可以使用「訂閱」,但這意味着我將不得不訂閱視圖模型中的每個可觀察對象,我不想這樣做。 形象地說,我想訂閱整個ViewModel,而不是每個可觀察的內部。 我該怎麼辦?

function PersonViewModel() { 
     this.firstName = ko.observable("John"); 
     this.lastName = ko.observable("Doe"); 
     this.middleName = ko.observable(); 
     this.userName = ko.observable("Johnny"); 
     this.dateOfBirth = ko.observable("12/12/2012"); 

    this.firstName.subscribe(function() { 
     alert("fisrtName changed"); 
    }); 
} 

function AddressViewModel() { 
     this.city = ko.observable("@Model.City"); 
     this.street = ko.observable("@Model.Street"); 
    } 

var pvm = new PersonViewModel(); 
var avm = new AddressViewModel(); 
var pNode = $("#personal-information").get(0); 
var aNode = $("#address-information").get(0); 
ko.applyBindings(pvm, pNode); 
ko.applyBindings(avm, aNode); 

我的HTML:

<div id="personal-information"> 
     <input data-bind="value: firstName" type="text" > 
     <input data-bind="value: lastName" type="text" > 
     <input data-bind="value: middleName" type="text" > 
     <input data-bind="value: username" type="text" > 
     <input data-bind="value: dateOfBirth" type="text" > 
    </div> 

任何幫助將不勝感激。 謝謝。

+1

檢查這個帖子http://stackoverflow.com/questions/10622707/detecting-change-to-knockout-view-model – Agalo

回答

2

Knockout包含一個ko.toJS函數,它「克隆你的視圖模型的對象圖,用每個可觀察值代替該可觀察對象的當前值,因此你得到一個只包含你的數據並且沒有Knockout相關構件的普通副本。如果在計算中調用ko.toJS,那麼只要視圖模型中的任何可觀察值發生更改,計算的值就會更新。

var p = ko.computed(function() { 
    return ko.toJS(pvm); 
}); 
var log = ko.observableArray(); 
p.subscribe(function (value) { 
    log.push("Person changed"); 
}); 

https://jsfiddle.net/mbest/ubLzwerp/

另見https://stackoverflow.com/a/7850364/1287183

+0

感謝邁克爾。但現在我發現,這項工作只與,當我使用'的'value'綁定將更新observable以匹配列表中的某個項目。這就是你得到更新的原因。您可以在爲主視圖模型調用applyBindings之後初始化「記錄器」,或者確保在構造函數中正確設置了所選值。 –

相關問題