0
目的は、可能な状態ごとにフィルタリングされた項目リストを表示することです。そのようなリストは多くの場所で表示する必要があるかもしれないので、私はテンプレートを試しています。テンプレートはfilterItemsを呼び出して、そのアイテムの特定のリストを取得します。knockout - 計算された関数でテンプレートデータを使用する方法
以下のfilterItemsコードは、viewModel(current_filter)のフィールドを使用しているので、すべてのリストは同じ項目を持ちます(3と8は準備完了状態です):(それは考えていません。これは正しいフィルター値が含まれています。filterItems機能が利用できる。このフィルタ値を作成する方法はありますか?
<script>
var viewModel = {
items: ko.observableArray(
[
{ "iid": 1, "state": "entered" },
{ "iid": 3, "state": "ready" },
{ "iid": 4, "state": "delivered" },
{ "iid": 8, "state": "ready" },
{ "iid": 13, "state": "entered" }
]),
states: ko.observableArray(
[
{ "sid": 1, "filter": "entered", "color": "yellow" },
{ "sid": 2, "filter": "ready", "color": "red" },
{ "sid": 3, "filter": "delivered", "color": "blue" }
]),
current_filter: 'ready'
}
viewModel.filterItems = ko.computed(function() {
var filtered_items = [];
for (var i = 0; i < viewModel.items().length; ++i)
if(viewModel.items()[i].state == viewModel.current_filter)
filtered_items.push(viewModel.items()[i]);
return filtered_items;
}, viewModel);
</script>
<div data-bind="foreach: states">
<div data-bind="template: {name: 'state', data: $data}"></div>
<script type="text/html" id="state">
<h2 data-bind="text: filter"></h2>
<ul data-bind="foreach:viewModel.filterItems()">
<li>
<div data-bind="text: iid"></div>
</li>
</ul>
</script>
</div>
<script>ko.applyBindings(viewModel);</script>
jsFiddle https://jsfiddle.net/mthrock/kxpfdfva/8/#&togetherjs=JKJOos6VJc
感謝。私はこれが好きですが、少し遊んでいなければなりません。完全なシステムでは、ビューモデルは全面的に使用される必要があります。つまり、複数のビューを駆動する可能性があります。 – user3088798