Knockout.js pureComputed和observableArray未被条件变量命中
当Knockout.js pureComputed和observableArray未被条件变量命中,knockout.js,Knockout.js,当self.Matchup不为空时,knockout.js是否可以重新验证ConflicingGamesself.matchip不是可观察的,最初为空 self.Conflict = ko.pureComputed(function () { return self.Matchup ? self.Matchup.ConflictingGames.length > 0 : false; }); 您的检查似乎无效,因为您没有实际检查可观察数组长度是否为
self.Matchup
不为空时,knockout.js是否可以重新验证ConflicingGames
self.matchip
不是可观察的,最初为空
self.Conflict = ko.pureComputed(function () {
return self.Matchup ? self.Matchup.ConflictingGames.length > 0 : false;
});
您的检查似乎无效,因为您没有实际检查可观察数组长度是否为
>0
。可能应该是:
self.Conflict = ko.pureComputed(function() {
return self.Matchup ? self.Matchup.ConflictingGames().length > 0 : false;
});
如果你想通过ko
检查来防御,你应该使用ko.isObservable
另外,由于您使用的是pureComputed
,因此在调用可观察对象之前发生什么并不重要。。。只要在调用时,所包含的可观察项存在。与立即评估的计算的
观测值不同
下面是一个简单的例子:
var-vm={
数组:空
};
vm.array=ko.observearray([150]);
vm.status=ko.pureComputed(函数(){
返回此.array().length>0?“正foo”:“foo”;
},vm);
vm.fooStatus=ko.pureComputed(函数(){
返回this.array.length>0?“正foo”:“foo”;
},vm);
console.log(vm.status())
console.log(vm.fooStatus())
如何创建依赖项
无论何时求值,敲除的计算结果都会确定其依赖项。举个例子:
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
我们很快看到,只要匹配为null
(或任何其他虚假值),就会创建0依赖项敲除无法创建依赖项;就敲除而言,这只是一个常数
修复
“简单”的解决方案是使匹配成为模型中的可观察值。例如,类似于:
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);
};
如果您不想更改属性的类型,我能想到的唯一可接受的选择是:
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时。我这样做了,但问题是可观察对象再也不会被执行,因为self.matchip不是可观察对象触发计算可观察对象的唯一方法是通过可观察对象包装更改或通过valuehassmutated()进行
在computed
和notpureComputed
场景中。