Knockout - ko.computed with ko.isObservable and peek()

时间:2015-12-11 09:49:12

标签: javascript knockout.js

我有问题。请帮帮我。 我有ko.computed,它有一个检查ko.isObservable变量,我需要ko.computed不对这个变量的变化作出反应。 请看示例:

ko.computed(function() {
      if ( ko.isObservable(test.peek()) ) {
        console.log('TRUE');
      }
});

-------或--------

ko.computed(function() {
      if ( ko.isObservable(test).peek() ) {
        console.log('TRUE');
      }
});

我有错误: 无法读取属性'peek'的null

如果我这样做:

 ko.computed(function() {
     var testTest = ko.isObservable(test) ? test.peek() : false;
          if ( testTest ) {
            console.log('TRUE');
          }
 });

ko.computed都会对'test'的变化作出反应。

ko.computed如何对此变量的变化做出反应?

2 个答案:

答案 0 :(得分:1)

如果你想重新计算“测试”值的变化并且不知道 - “test”是否可观察:

ko.computed(function() {
      if ( ko.unwrap(test) ) {
        console.log('TRUE');
      }
});

另外我不太明白 - 为什么你在计算机内部使用peek()?这可以防止计算在“测试”值更改时重新计算。

更新

我不想对“测试”值的变化作出反应:

ko.computed(function() {
      var testValue = ko.isObservable(test) ? test.peek() : test;
      if ( testValue ) {
        console.log('TRUE');
      }
 });

答案 1 :(得分:0)

如果您只想要测试变量的值并且您不知道它是否是可观察的,则可以使用ko.utils.unwrapObservable来获取值。像这样:

ko.computed(function() {
    var value = ko.utils.unwrapObservable(test);
});

在你的例子中,你得到了js错误,因为你试图对ko.isObservable()的结果使用peek(),对于observables是true,对于其他一切都是null。