たとえばJohn Lewisのもののように、メイン ビューをフィルタリングするサイドバーを構築しています。コードは機能していますが、きれいではありません。
同様の行にいくつかのSOの質問があることは知っていますが、自分のユースケースを完全に理解することはできません.
ShopView で observableArrays を動的に作成するには、サーバーから (たとえば JSON 経由で) チェックボックスの名前を取得する必要があります。
方法は次のとおりです。
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
});
NBクライアント側でフィルタリングを実行しようとしているわけではありません。動的にバインドされたチェックボックスが変更されたときにビューモデルを更新するだけです。
何か案は?ありがとう!