1
我在Knockout中建立了一组过滤器,并希望将当前的过滤器设置存储在对象上。如果有任何更改,我需要过滤我的数据。KnockoutJS观察对象的可观察对象
即使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>
要小心创建大量的订阅,尽管(他们四处闲逛并且_will_会使用内存 - 随着时间的推移,SPA可能会受到很大影响) - 理论上你需要在“filter”_does_ change时订阅 - 此时你应该可能还会从之前的“过滤器”值中处理订阅。 –
@JamesThorpe哦!我之前正在查找内存泄漏,将检查其他订阅。 – PeterB
@PeterB如果你的页面生存的时间不长,确保每个'subscribe'的返回值都存储在某个地方,并且相应地调用['dispose''](http:// knockoutjs。 com/documentation/observables.html#highlighter_397069)在正确的时间使用。 –