改变观察,但不通知订阅者在knockout.js

有没有办法忽略观察者的值变化的订阅者。 Id喜欢改变一个observable的值,但不能为knockout.js的订阅者执行它

通常这是不可能的或不可取的,因为它可能使事情在依赖链中不同步。 使用节stream阀扩展器通常是限制依赖关系正在接收的通知数量的好方法。

但是,如果你真的想这样做,那么一个select是覆盖notifySubscribers上的notifySubscribers函数,并检查一个标志。

这里是一个扩展,它将这个function添加到可观察对象中:

 ko.observable.fn.withPausing = function() { this.notifySubscribers = function() { if (!this.pauseNotifications) { ko.subscribable.fn.notifySubscribers.apply(this, arguments); } }; this.sneakyUpdate = function(newValue) { this.pauseNotifications = true; this(newValue); this.pauseNotifications = false; }; return this; }; 

你可以把这个添加到像下面这样的观察者:

 this.name = ko.observable("Bob").withPausing(); 

那么你会更新它没有通知做:

 this.name.sneakyUpdate("Ted"); 

一个更简单的方法:

 ko.observable.fn.silentUpdate = function(value) { this.notifySubscribers = function() {}; this(value); this.notifySubscribers = function() { ko.subscribable.fn.notifySubscribers.apply(this, arguments); }; }; 

使用它如下:

 this.status = ko.observable("Happily Married"); this.walkIntoBar(); this.status.silentUpdate("Single"); this.walkOutOfBar(); // careful with exceptions this.status.silentUpdate("Happily Married"); 

要谨慎使用。 我们正在处理一个可观察的对象,如果你没有通知你的用户,那么可能会发生不好的事情。

当所有用户需要被忽略时,我喜欢@RP Niemeyer提供的解决scheme。 但是,对于我的情况,我有一个可观察的select控件上的双向绑定。 当使用@RP Niemeyer时 ,select控件不会更新。 所以,我真的需要一种方法来closures特定的观察者,而不是全部。 这是这种情况的一个通用解决scheme。

为“安静”订阅和“安静”写入添加扩展方法。

 ko.observable.fn.ignorePokeSubscribe = function (callback, thisValue, event){ var self = this; this.subscribe(function(newValue) { if (!self.paused) callback(newValue); }, thisValue, event); return this; }; ko.observable.fn.poke = function (newValue) { this.paused = true; var result = this(newValue); this.paused = undefined; return result; }; 

你会订阅观察像:

 this.name = ko.observable("Bob"); this.name.ignorePokeSubscribe(function(newValue) { /* handler */ })); 

然后,您将通过执行以下操作更新它,而无需特定的通知

 this.name.poke("Ted"); // standard subscribers still get notified 

我来到这个问题,因为我正在build立一个分页数据网格。 只显示了10行,每行都有一个checkbox。 表头有一个(德)select所有checkbox。

在负载testing期间,我们发现单击全选checkbox会导致一次更新1000个观测值。 这太长了。

看起来KO更新了1000次HTML,即使只有10个观察者被绑定到了HTML。

如果有人出于同样的原因发现这个问题,我会build议寻找延期更新。 延迟更新队列通知订阅者,它会在你的'线程'完成后通知你的订阅者。 延期更新可以configuration每个观察或整个应用程序。

http://knockoutjs.com/documentation/deferred-updates.html