【发布时间】:2013-01-07 04:08:06
【问题描述】:
我正在构建一个侧边栏来过滤主视图,例如John Lewis 中的那个。我的代码可以运行,但它并不漂亮。
我知道有几个类似的问题,但我不能完全理解我自己的用例。
我需要从服务器(例如通过 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
});
注意我不想在客户端进行过滤 - 只是在动态绑定的复选框更改时更新我的视图模型。
有什么想法吗?谢谢!
【问题讨论】:
-
是什么阻止您订阅
this.filters?只要您在ko.mapping.fromJS通话后订阅就可以了。 -
this.filters 不是可观察的 - 它只是一个对象属性
-
您是否同时控制了客户端和服务器代码?你愿意改变你的视图模型吗?
-
@Tyrsius 是的,我愿意。是的,自然 :-)
标签: javascript knockout.js knockout-mapping-plugin