2017-02-20 82 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之后初始化“记录器”,或者确保在构造函数中正确设置了所选值。 –

相关问题