我试图创建一个简单的isDirty
样式的Knockout绑定。我已经看到了使用toJS
转换的示例,但使用此方法进行多次触发observable时会有点复杂。据我所知,我希望预先订阅可观察性,我认为我只是这样做。这是我目前获得的代码:
var isDirty = false;
this.types = ko.observableArray([]);
this.instances = ko.observableArray([]);
this.selection = ko.observable();
this.filters = ko.observableArray([]);
// Some Logging to try and figure out what's going on
this.types.subscribe(function() { console.log("types changed " + new Date().getTime()) });
this.instances.subscribe(function() { console.log("instances changed " + new Date().getTime()) });
this.selection.subscribe(function() { console.log("selection changed " + new Date().getTime()) });
this.filters.subscribe(function() { console.log("filters changed " + new Date().getTime()) });
// Flag to use to determine if the context property has changed
this.isDirty = ko.computed(function() {
console.log("isDirty changed " + new Date().getTime());
let types = self.types();
let instances = self.instances();
let selection = self.selection();
let filters = self.filters();
return isDirty = !isDirty;
}).extend({ rateLimit: 500 });
this.isDirty.subscribe(function(changes) {
console.log("context changed " + new Date().getTime());
});
所以我的代码可以随时修改types
,instances
,selection
或filters
,我真的不想关心这个问题太多了。实际上会有快速连续的几个修改(例如,types
中添加了一个新项目,同时修改了selection
。)
我遇到的问题是,即使我尝试添加的rateLimit
,我似乎也会受到多次火灾,我不明白为什么。这是我进行更改时的控制台输出:
context.js:59 isDirty已更改1455203776330
context.js:52种类型已更改1455203776331
context.js:53个实例已更改1455203776333
context.js:54选择更改1455203776333
context.js:55过滤器已更改1455203776333
context.js:52种类型已更改1455203776334
context.js:53个实例已更改1455203776334
context.js:54选择更改1455203776335
context.js:52种类型已更改1455203776409
context.js:53个实例已更改1455203776413
context.js:54选择更改1455203776413
context.js:59 isDirty changed 1455203776832
context.js:68 context更改1455203776832
context.js:59 isDirty changed 1455203776912
context.js:68 context更改1455203776913
所以我无法弄清楚为什么在完成所有更改后(例如selection
的{{1}}更改是最后一次更改)为什么1455203776413
之后会发生两次更改...
我补充一点,我试图整理一个片段来重现这个错误,尽管目前似乎并没有起作用。我只想弄清楚我的代码的其他部分可能会对此产生副作用。
答案 0 :(得分:1)
这里有一个教训 - 确保您只有一个您正在跟踪的项目。只是碰巧传递了ViewModel
的{strong>副本,这也是触发控制台。