pureComputed和observableArray未被条件变量击中

时间:2018-11-26 19:09:53

标签: knockout.js

ConflicingGames不为null的情况下,是否仍有适用于基因敲除.js的self.Matchup重新评估的方法。 self.Matchup不是可观察的,并且最初为NULL。

self.Conflict = ko.pureComputed(function () {
            return self.Matchup ? self.Matchup.ConflictingGames.length > 0 : false;
        });

2 个答案:

答案 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 依赖性:

  1. takeA
  2. a

即使b出现在函数主体中,也不会对其进行评估,因此它不是依赖项。如果要这样做:

takeA(false)

aOrB的依存关系将更改为:

  1. takeA
  2. b

这对您的特定代码意味着什么

查看此功能:

self.Matchup ? self.Matchup.ConflictingGames().length > 0 : false

我们很快看到,只要Matchupnull(或任何其他虚假值),就会创建 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