我正在构建一个侧边栏来过滤主视图,例如John Lewis的侧边栏。我有代码工作,但它并不漂亮。
我知道在类似的行上有几个 SO 问题,但我无法完全理解我自己的用例。
我需要从服务器(例如通过 JSON)获取复选框的名称,以便在我的 ShopView 上动态创建 observableArrays。
它是这样的:
var data = {
'gender' : [ ],
'color' : [ ]
};
var filterMapping = {
create: function( obj ) {
return ko.observableArray( obj.data );
}
}
var ShopView = new function() {
var self = this;
ko.mapping.fromJS( { filters: data }, filterMapping, self );
// this is the bit I don't like
this.filterChange = ko.computed(function () {
for( var key in self.filters ) {
var obj = self.filters[key];
if( ko.isObservable(obj)){
obj();
}
}
});
this.filterChange.subscribe( function( ) {
//make AJAX request for products using filter state
});
}
我的 HTML 看起来和你期望的一样:
性别
<ul>
<li><input type="checkbox" value="male" data-bind="checked: filters.gender" />Male</li>
<li><input type="checkbox" value="female" data-bind="checked: filters.gender" />Female</li>
</ul>
正如我所说,它有效,但它并不好。在理想的世界中,我可以订阅 this.filters,例如
this.filters.subscribe( function() {
//make AJAX request for products using filter state
});
注意我不是想在客户端进行过滤——只是在动态绑定的复选框发生变化时更新我的视图模型。
有任何想法吗?谢谢!