KnockoutJS观察可观测对象

时间:2016-06-29 15:14:58

标签: knockout.js

我正在Knockout中构建一组过滤器,并希望将当前过滤器设置存储在对象上。如果有任何更改,我需要过滤我的数据。

即使Filter对象发生更改,也永远不会触发对self.filter的订阅。这可以被观察到吗?



var Filter = function() {
    this.gender = ko.observable("");
    this.role = ko.observable("");
};
viewModel = function() {
  var self = this;
  self.filter = ko.observable(new Filter());
  self.filter.subscribe(function(obj) {
    console.log("The filter has been modified! (this line never runs)", obj);
  });
  
  self.output = function() { console.log("Gender", self.filter().gender(), "Role", self.filter().role());}
};

vm = new viewModel();
ko.applyBindings(vm);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>


<select data-bind="value: filter().gender">
  <option value="">Male or Female</option>
  <option value="M">Male</option>
  <option value="F">Female</option>
</select>
<select data-bind="value: filter().role">
  <option value="">Any</option>
  <option value="Student">Student</option>
  <option value="Guest">Guest</option>
</select>

<p>
<button data-bind="click: output">
Output Filter values (to prove the object is updated)
</button>
</p>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:1)

filter没有改变,这就是订阅功能没有被击中的原因。然而,gender rolefilter可观察量会发生变化。

当性别下拉列表发生变化时,

self.filter().gender.subscribe()会被调用。调用self.filter.subscribe()的唯一方法是更改​​过滤器本身的值,例如self.filter(new Filter())

如果filter具有可观察的属性(除非你要像上面的例子那样创建新的过滤器而不仅仅是改变它的属性),那么使{{1}}可观察没有多大意义。