在ConflicingGames
不为null的情况下,是否仍有适用于基因敲除.js的self.Matchup
重新评估的方法。 self.Matchup
不是可观察的,并且最初为NULL。
self.Conflict = ko.pureComputed(function () {
return self.Matchup ? self.Matchup.ConflictingGames.length > 0 : false;
});
答案 0 :(得分:1)
您检查的好像不是ko
有效,因为您实际上没有检查可观察到的数组长度是否为> 0
。可能应该是:
self.Conflict = ko.pureComputed(function() {
return self.Matchup ? self.Matchup.ConflictingGames().length > 0 : false;
});
如果您想对ko
采取防御措施,则应该使用ko.isObservable
。
此外,由于您使用的是pureComputed
,因此在调用可观察对象之前发生的事情没有关系...只要在调用时存在封闭的可观察对象即可。 computed
的可观察值立即进行评估的情况并非如此。
这是一个简单的例子:
var vm = {
array: null
};
vm.array = ko.observableArray([150]);
vm.status = ko.pureComputed(function() {
return this.array().length > 0 ? "positive foo" : "foo";
}, vm);
vm.fooStatus = ko.pureComputed(function() {
return this.array.length > 0 ? "positive foo" : "foo";
}, vm);
console.log(vm.status())
console.log(vm.fooStatus())
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
答案 1 :(得分:0)
计算出来的淘汰赛会在评估时确定其依赖性。举个例子:
const a = ko.observable("a");
const b = ko.observable("b");
const takeA = ko.observable(true);
const aOrB = ko.pureComputed(
() => takeA() ? a() : b()
);
计算值aOrB
具有 2 依赖性:
takeA
a
即使b
出现在函数主体中,也不会对其进行评估,因此它不是依赖项。如果要这样做:
takeA(false)
aOrB
的依存关系将更改为:
takeA
b
查看此功能:
self.Matchup ? self.Matchup.ConflictingGames().length > 0 : false
我们很快看到,只要Matchup
为null
(或任何其他虚假值),就会创建 0 依赖项。 淘汰赛无法创建依赖关系;就敲除而言,此计算只是一个const
。
“简单”的解决方案是使Matchup
在模型中成为可观察的值。例如:
self.Matchup = ko.observable(data.Matchup);
self.Conflict = ko.pureComputed(() =>
self.Matchup()
? self.Matchup().ConflictingGames().length > 0
: false
);
如果您不想更改属性的类型,我能想到的唯一可接受的替代方法是:
self.Conflict = ko.pureComputed(() =>
self.matchupInitialized() && self.Matchup
? self.Matchup.ConflictingGames().length > 0
: false
);
self.matchupInitialized = ko.observable(false);
self.Matchup = null;
self.setMatchup = function(v) {
self.Matchup = v;
self.matchupInitialized(true);
};
虽然仍然感觉很像黑客,但是当您从true切换为false时,您只能设置一次Matchup
。