KnockoutJS观察对象的可观察对象

KnockoutJS观察对象的可观察对象

问题描述:

我在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>

filter不会改变,这就是为什么订阅功能不被打到。但是,和role的可观测量filter变化。当性别下拉改变时,self.filter().gender.subscribe()将被调用。 self.filter.subscribe()将被调用的唯一方法是如果您更改过滤器本身的值,例如self.filter(new Filter())

如果filter只有可观察的属性(除非您要像上例中那样创建新的过滤器,而不是仅仅改变其属性),那么没有多大意义。

+0

要小心创建大量的订阅,尽管(他们四处闲逛并且_will_会使用内存 - 随着时间的推移,SPA可能会受到很大影响) - 理论上你需要在“filter”_does_ change时订阅 - 此时你应该可能还会从之前的“过滤器”值中处理订阅。 –

+0

@JamesThorpe哦!我之前正在查找内存泄漏,将检查其他订阅。 – PeterB

+0

@PeterB如果你的页面生存的时间不长,确保每个'subscribe'的返回值都存储在某个地方,并且相应地调用['dispose''](http:// knockoutjs。 com/documentation/observables.html#highlighter_397069)在正确的时间使用。 –