淘汰赛纯计算可观察不更新

Sha*_*eKm 1 knockout.js

具有以下模型:

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

  var isValid = ko.pureComputed(function () {
    return dataModel().isValid;
  });
Run Code Online (Sandbox Code Playgroud)

我有以下功能:

      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()));          
      }
Run Code Online (Sandbox Code Playgroud)

每当我运行testMe()

dataModel.isValid = false

并执行

console.log(“ isValid:” + isValid())

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

dataModel({isValid:false}); 但是,通过这种方式,我失去了模型中的所有其他属性。我该如何进行这项工作?

我究竟做错了什么?

Roy*_*y J 6

isValid不是可观察的。计算对象仅在其可观察项之一已更改的情况下才知道更新。或者,您可以使用来告知Knockout dataModel已更改(这是计算对象所观察到的可观察到的结果,它将导致计算对象重新计算)dataModel.valueHasMutated()

我还是建议使用可观察的。尝试这样的事情:

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();
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
Run Code Online (Sandbox Code Playgroud)