Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js pureComputed和observableArray未被条件变量命中_Knockout.js - Fatal编程技术网

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
    和not
    pureComputed
    场景中。