【问题标题】:Knockout - ko.computed with ko.isObservable and peek()淘汰赛 - ko.computed 与 ko.isObservable 和 peek()
【发布时间】:2016-03-17 04:27:41
【问题描述】:

我有问题。请帮帮我。 我有 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');
      }
});

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

如果我这样做:

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

ko.computed 对 'test' 的变化同样会做出反应。

ko.computed 如何不对这个变量的变化做出反应?

【问题讨论】:

  • 如果您不想对更改做出反应,为什么还要有computed?只使用普通功能?这听起来像是XY Problem - 你想解决什么问题?
  • 对不起。我需要检查 ko.isObservable 并使用 peek() ,当我更改变量“test”时,ko.computed 不会做出反应,但我不知道如何将它们一起使用。另外,如果我使用例如: ko.isObservable(test) ? test.peek() : 假的;如果我更改变量“测试”,ko.computed 会做出反应。我需要类似 ko.isObservable(test).peek() 的东西,但“test”可以为空。

标签: javascript knockout.js


【解决方案1】:

如果您想根据“测试”值的变化重新计算计算结果,但不知道“测试”是否可观察:

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');
      }
 });

【讨论】:

  • 谢谢。我明白了。
【解决方案2】:

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

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

在您的示例中,您收到 js 错误,因为您尝试对 ko.isObservable() 的结果使用 peek(),这对于可观察对象为 true,对于其他所有内容为 null。

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 2019-06-18
    • 2012-07-20
    • 2013-10-31
    • 2012-06-06
    • 2015-06-02
    相关资源
    最近更新 更多