【问题标题】:Knockout pure computed observable not updating剔除纯计算的 observable 不更新
【发布时间】:2017-01-16 20:44:26
【问题描述】:

具有以下模型:

  var dataModel = ko.observable({ someProp: ko.observable() });

  var isValid = ko.pureComputed(function () {
    return dataModel().isValid;
  });

我有以下功能:

      function testMe() {
          dataModel().isValid = false; // This does not work, why?
          console.log("isValid: " + isValid()); // Doesn't update, shows old value 

          dataModel({ isValid: false }); // This works however I loose all other properties
          console.log("isValid: " + isValid()); // Prints correctly updated value

          console.log(ko.toJSON(dataModel()));          
      }

每当我运行 testMe()

dataModel.isValid = false

并执行

console.log("isValid:" + isValid())

即使我在上面将其设置为 false,它仍然设置为“true”...为什么?我让它工作的唯一方法就是做

dataModel({ isValid: false }); 但是这样我就失去了模型中的所有其他属性。我怎样才能做到这一点?

我做错了什么?

【问题讨论】:

  • 如果我运行您的代码时在任何情况下都看不到“true”,请参阅this jsfiddle,您能否尝试创建一个“minimal reproducible example”并解释为什么 i> 你期待上述结果吗?
  • 另外,请意识到如果(纯)计算依赖于一个不可可观察的变量,它可能无法正确更新。

标签: knockout.js


【解决方案1】:

isValid 不是可观察的。计算对象只有在其可观察对象之一发生更改时才知道更新。或者,您可以使用dataModel.valueHasMutated() 告诉 Knockout dataModel 已更改(这是计算查看的可观察对象,将导致计算重新计算)。

不过,我建议使用 observable。试试这样的:

var dataModel = ko.observable({
  someProp: ko.observable(),
  isValid: ko.observable(true)
});

var isValid = ko.pureComputed(function() {
  return dataModel().isValid();
});

function testMe() {
  console.log("isValid: " + isValid());
  dataModel().isValid(false);
  console.log("isValid: " + isValid());

  console.log(ko.toJSON(dataModel()));
}

testMe();
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

【讨论】:

  • 物有所值。非常感谢!。还有一个问题。即使 isValid 不是可观察的,为什么@Jeroen 的示例仍然有效? jsfiddle.net/8fdyyhr2
  • @ShaneKm 在他的示例中,isValid 的值永远不会改变。它开始为假并保持为假。这就是他的评论所说的。
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 2016-11-03
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多