我如何仅通过其可观察 属性 的变化就知道 knockout.js ViewModel 的变化?
How can i know change in knockout.js ViewModel just by change in its observable property?
我在 knockout.js 中有一个用于个人信息的 ViewModel。
我希望 javascript 认为如果仅更改该模型中的单个可观察对象 属性,则整个 PersonViewModel 都会更改。
我还有另一个 ViewModel 作为地址,我想要同样的地址。
作为程序的最终用户,我希望程序通过任何可观察 属性.
的变化来判断哪个视图模型发生了变化
我可以使用 "subscribe" 但这意味着我必须订阅视图模型中的每个可观察对象,我不想这样做。
形象地说,我想订阅整个 ViewModel 而不是其中的每个 observable。
我该怎么办?
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>
如有任何帮助,我们将不胜感激。
谢谢
Knockout 包含一个 ko.toJS
函数,"clones your view model’s object graph, substituting for each observable the current value of that observable, so you get a plain copy that contains only your data and no Knockout-related artifacts." 如果您在计算中调用 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/
另见
我在 knockout.js 中有一个用于个人信息的 ViewModel。 我希望 javascript 认为如果仅更改该模型中的单个可观察对象 属性,则整个 PersonViewModel 都会更改。
我还有另一个 ViewModel 作为地址,我想要同样的地址。 作为程序的最终用户,我希望程序通过任何可观察 属性.
的变化来判断哪个视图模型发生了变化我可以使用 "subscribe" 但这意味着我必须订阅视图模型中的每个可观察对象,我不想这样做。 形象地说,我想订阅整个 ViewModel 而不是其中的每个 observable。 我该怎么办?
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>
如有任何帮助,我们将不胜感激。 谢谢
Knockout 包含一个 ko.toJS
函数,"clones your view model’s object graph, substituting for each observable the current value of that observable, so you get a plain copy that contains only your data and no Knockout-related artifacts." 如果您在计算中调用 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/
另见