改变观察,但不通知订阅者在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每个观察或整个应用程序。