Knockout pure computed observable不更新

时间:2016-09-08 19:44:22

标签: knockout.js

拥有以下型号:

  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())

它仍然设置为" true"即使我把它设置为假,但为什么?我让它工作的唯一方法是做

  

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

我做错了什么?

1 个答案:

答案 0 :(得分:4)

isValid不是可观察的。计算只会知道更新其中一个可观察量是否已更改。或者,您可以使用dataModel.valueHasMutated()告诉Knockout dataModel已更改(这是计算机查看的可观察对象,将导致计算机重新计算)。

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

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>