KnockoutJS使用Mapping Plugin订阅属性更改

反正我是否可以告诉淘汰映射插件订阅所有属性更改调用某个函数?

我意识到我可以用这种方式手动订阅属性更改事件:

var viewModel = { name: ko.observable('foo'), } // subscribe manually here viewModel.name.subscribe(function(newValue){ // do work }) 

我希望能够一般订阅,因为我的视图模型可能会有所不同,我不想硬编码属性名称。 我创建了一个执行此操作的函数,但它可能不是最好的方法。 它适用于IE7及以下版本的所有浏览器。

在这里,我将viewmodel作为参数,并尝试反映它订阅属性:

 function subscribeToKO(data) { $.each(data, function (property, value) { if (getType(value) == "Object") data[property] = subscribeToKO(value); else if (getType(value) == "Array") { $.each(value, function (index, item) { item = subscribeToKO(item); }); } else { if (value.subscribe) { value.subscribe(function (newValue) { // do work }); } } }); return data; } 

就像我说的那样有效,但是因为我正在使用映射插件,所以我希望有一个钩子可以用来为它提供一个通常会订阅属性更改的函数。

就像是:

 mapping = { create: function(options){ options.data.subscribe(function(newValue){ // do work ??? }); } } ko.mapping.fromJS(viewModel, mapping); 

有任何想法吗?

这是基于Ryan Niemeyer肮脏旗帜的通用方法。
点击这里查看JsFiddle 。

HTML:

 
  1. Telephone :
  2. Address :

使用Javascript:

 var model = { telephone: ko.observable('0294658963'), address: ko.observable('167 New Crest Rd') }; // knockout extension for creating a changed flag (similar to Ryan's dirty flag except it resets itself after every change) ko.changedFlag = function(root) { var result = function() {}; var initialState = ko.observable(ko.toJSON(root)); result.isChanged = ko.dependentObservable(function() { var changed = initialState() !== ko.toJSON(root); if (changed) result.reset(); return changed; }); result.reset = function() { initialState(ko.toJSON(root)); }; return result; }; // add changed flag property to the model model.changedFlag = new ko.changedFlag(model); // subscribe to changes model.changedFlag.isChanged.subscribe(function(isChanged) { if (isChanged) alert("model changed"); }); ko.applyBindings(model);​ 

这个方便的小插件非常接近你所做的,但它有几个选项,可以在更广泛的需求集上工作,而不需要Mapping插件:

https://github.com/ZiadJ/knockoutjs-reactor

基本上它允许你编写这种代码:

 ko.watch(viewModel, function(target, trigger) { // do work });