我正在尝试为我的所有视图模型创建一个基类,例如,我可以检查 root-vm 上的“isDirty”并让它检查整个 vm 树(同时避免循环依赖)。
执行此操作时,我意识到 ko-properties 的顺序非常重要,因为计算属性根据创建属性时存在的其他属性设置其订阅。因此,如果我将像下面这样的 isDirty-computed 放在基类中,它总是会在它所依赖的属性甚至存在之前初始化。无论如何,简而言之,我注意到我可以使用 deferEvaluation 来解决这个问题。
我的问题是:
在所有计算属性上使用 deferEvaluation 有什么缺点吗?为什么默认情况下这种行为不正确?我什么时候需要将其设置为 false?
我可以更好地执行 isDirty-property 吗?关于改进它或以其他方式做的任何建议?
或者,是否有任何方法可以显式禁用计算属性的初始化,直到创建具有所有属性的整个对象,然后以某种方式运行它。我的意思是对我来说唯一的问题是订阅是在所有属性到位之前设置的。
注意:我正在使用 KO Lite 工具进行脏跟踪
function ViewModel() {
var self = this;
self.isDirty = ko.computed(function () {
for (var p in self) {
if (self[p].isDirty) {
if (self[p].isDirty()) return true;
}
else if (self[p].subscribe && self[p].push) { // assuming ko.observableArray
for (var i = 0, j = self[p]().length; i < j; i++) {
if (self[p]()[i].isDirty) {
if (self[p]()[i].isDirty()) return true;
}
}
}
}
return false;
}, this, { deferEvaluation: true });
}
注意:刚刚注意到如果我有另一个依赖于 isDirty 的计算属性,此代码将失败。这是意料之中的,但也是不幸的。如果我可以在对象创建后延迟并强制所有订阅,那就太好了。