当计算可观测依赖于许多其他可观测时,如何知道是哪个可观测变化触发了该计算可观测的求值函数?
发布于 2016-07-27 14:09:20
不可能找出是什么触发了computed__的更改。
The relevant source file实际上很容易理解,如果你深入研究它,你会发现一个计算机化的(也就是。dependentObservables)可以从多个来源触发更改。见鬼,当实际的更改通知发出时,对依赖项的多个异步调用可能已经导致了更改。这些信息都不会向KO库的用户公开。
如果你发现自己想要这个,你需要重新考虑你的方法。如果没有关于你的背景的任何细节,就不可能提供更具体的建议。
发布于 2016-07-27 21:19:52
您可以使用KO扩展器跟踪对可观察对象的更改。首先,您必须创建扩展函数。下面是一个非常简单的示例,它只需在可观察对象发生更改时添加一个标记即可。
ko.extenders.changeTracker = function(target, trackingPropertyName) {
target.subscribe(function(value) {
target[trackingPropertyName] = true;
});
return target;
}然后,您必须将此扩展器添加到被跟踪的可观察对象中。trackingPropertyName将用于读取和写入更改跟踪标志。
var trackingPropertyName = '__mytracker';
this.firstName = ko.observable().extend({ changeTracker: trackingPropertyName });
this.lastName = ko.observable().extend({ changeTracker: trackingPropertyName });在您的计算中,您将评估这些标志(并重置它们),以确定哪个观察值发生了变化。
this.fullName = ko.pureComputed(function() {
var f = this.firstName() || '';
var l = this.lastName() || '';
if (this.firstName[trackingPropertyName]) {
// firstName changed code here -- plus reset the flag
this.firstName[trackingPropertyName] = false;
}
if (this.lastName[trackingPropertyName]) {
// lastName changed code here -- plus reset the flag
this.lastName[trackingPropertyName] = false;
}
return f + ' ' + l;
}, this);这是一个小提琴:https://jsfiddle.net/8so7zjy5
或者一个ES5友好的版本:https://jsfiddle.net/8so7zjy5/1/
https://stackoverflow.com/questions/38603205
复制相似问题