Knockout.js 可观测对象

Knockout.js 可观测对象,knockout.js,Knockout.js,我正在Knockout中构建一组过滤器,并希望在对象上存储当前过滤器设置。当任何数据发生更改时,我需要过滤我的数据 对self.filter的订阅永远不会触发,即使筛选器对象发生更改。这能被观察到吗 var Filter=function(){ this.gender=ko.可观察(“”); this.role=ko.可观察(“”); }; viewModel=函数(){ var self=这个; self.filter=ko.observable(新过滤器()); self.filter.s

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

self.filter
的订阅永远不会触发,即使筛选器对象发生更改。这能被观察到吗

var Filter=function(){
this.gender=ko.可观察(“”);
this.role=ko.可观察(“”);
};
viewModel=函数(){
var self=这个;
self.filter=ko.observable(新过滤器());
self.filter.subscribe(函数(obj){
log(“过滤器已被修改!(此行从未运行)”,obj);
});
self.output=function(){console.log(“性别”,self.filter().Gender(),“角色”,self.filter().Role();}
};
vm=新的viewModel();
ko.应用绑定(vm)

男还是女
男性
女性
任何
学生
客人

输出过滤器值(证明对象已更新)

过滤器不会改变,这就是订阅功能不会被激活的原因。然而,
过滤器
性别
角色
观察值确实发生了变化

当性别下拉列表更改时,将调用self.filter().gender.subscribe()
。调用
self.filter.subscribe()
的唯一方法是更改筛选器本身的值,例如
self.filter(new filter())


如果
过滤器只有可观察的属性,那么将其设置为可观察的就没有多大意义了(除非您要像上面的示例中那样创建新过滤器,而不是仅仅更改其属性)。

但是要小心创建大量订阅(他们会四处游荡并使用内存-SPA会随着时间的推移受到严重影响)-理论上,当
filter
发生更改时,您需要订阅-此时,您可能还应该处理来自上一个
filter
值的订阅。@JamesThorpe噢!我之前在查找内存泄漏,将检查其他订阅。@PeterB如果您的页面存在任何非平凡的时间长度,它是预处理的t确保每个
订阅
的返回值都存储在某个地方,并在正确的时间使用相应的调用,这一点很重要。@Paul Abbott,谢谢,这更有意义。构建此代码的更好方法是什么?我是否应该在
过滤器
上保持可观察性(我认为绑定到HTML所必需的),或者将所有可能的内容移动到viewModel?因为还有另外10个以上的过滤器,我正在寻找一种干净的方法来解决这些问题,并将所有设置的内容应用到数据中。