速率限制计算两次发射

时间:2016-02-11 15:20:07

标签: javascript knockout.js

我试图创建一个简单的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());
});

所以我的代码可以随时修改typesinstancesselectionfilters,我真的不想关心这个问题太多了。实际上会有快速连续的几个修改(例如,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之后会发生两次更改...

我补充一点,我试图整理一个片段来重现这个错误,尽管目前似乎并没有起作用。我只想弄清楚我的代码的其他部分可能会对此产生副作用。

1 个答案:

答案 0 :(得分:1)

这里有一个教训 - 确保您只有一个您正在跟踪的项目。只是碰巧传递了ViewModel的{​​strong>副本,这也是触发控制台。