假设我们想为一个observable分配一个新值并通知订阅者,无论新值是否等于旧值。
默认情况下,如果新值与旧值相同,Knockout将不会通知订阅者,因此我们需要采取一些额外步骤来实现我们的目标。
我知道有扩展器currentPage.extend({ notify: 'always' })
但我只在特定的地方需要这种行为,而不是全局的可观察物。
目前,我正在使用以下方法:
// Some view model property of primitive type
self.currentPage = ko.observable(1);
// Some view model method
self.foo = function (newPage) {
var currentPageObservable = self.currentPage;
// Save the old value
var oldCurrentPageValue = currentPageObservable();
// Update the observable with a new value
currentPageObservable(newPage);
if(oldCurrentPageValue === newPage) {
// If old and new values are the same - notify subscribers manually
currentPageObservable.valueHasMutated();
}
};
但看起来可能会更好。
为什么Knockout没有提供一种方法来为一个始终通知订阅者的观察者分配一个新值?或者我错过了这个? 您实现相同任务的方法是什么?
答案 0 :(得分:10)
你的方法已经足够好了,除非你可能想要重构它,以便在值发生变化时不通知订阅者两次。
if (oldCurrentPageValue !== newPage) {
// Update the observable with a new value
currentPageObservable(newPage);
}
else {
// If old and new values are the same - notify subscribers manually
currentPageObservable.valueHasMutated();
}
在您的情况下currentPageObservable(newPage)
会通知订阅者,并且valueHasMutated
之后会立即通知订阅者。
另一种方法是使用特定方法扩展ko.observable
ko.myObservable = function Observable(initialValue) {
var result = ko.observable(initialValue);
result.updateWithNotification = function (newValue) {
...
}
return result;
}
var o = ko.myObservable();
o.updateWithNotification(newValue);