私の見解では、observableArray(item)でもある1つのプロパティを持つobservableArray(itemGroup)をループしています。itemGroup全体を削除するメソッドとitemGroupからアイテムを削除するメソッドがありますが、その行に沿っていくつかのロジックを追加したいのですが、グループに残っているアイテムは1つだけで、そのアイテムを削除するとitemGroupも削除されます。
これが私のビューモデルとビューの関連部分の例です。
私のJS
var ItemModel = function(item) {
var self = this;
self.name = ko.observable(item.name);
self.price = ko.observable(item.price);
};
var ItemGroupModel = function(itemGroup) {
var self = this;
self.order = ko.observable(itemGroup.order);
self.items = ko.observableArray(ko.utils.arrayMap(itemGroup.items, function(item){
return new ItemModel(item);
}));
self.type = ko.observable(item.type);
self.removeItem = function(item) {
self.items.remove(item);
}
};
var ViewModel = function(data) {
var self = this;
self.itemGroups = ko.observableArray(ko.utils.arrayMap(data.itemGroups, function(itemGroup) {
return new ItemGroupModel(item);
}));
// some other properties and methods
self.removeItemGroup = function(itemGroup) {
self.itemGroups.remove(itemGroup);
}
};
私の見解
<ul data-bind="foreach: {data: VM.itemGroups, as: 'itemGroup'}">
<li>
<button data-bind="click: $root.VM.removeItemGroup">X</button>
<ul data-bind="foreach: {data: itemGroup.items, as: 'item'}">
<li>
<!-- ko if: itemGroup.items().length > 1 -->
<button data-bind="click: itemGroup.removeItem">X</button>
<!-- /ko -->
<!-- ko ifnot: itemGroup.items().length > 1 -->
<button data-bind="click: function () { $root.VM.removeItemGroup($parent) }">X</button>
<!-- /ko -->
</li>
</ul>
</li>
</ul>
これは機能しますが、私にとっては理想的ではありません。ノックアウトは、「function(){$ root.VM.removeItemGroup($ parent)}」のような無名関数の使用を回避するのに役立つはずだと理解していますが、別の方法でそれを行う方法がわかりません。また、ifステートメントとifnotステートメントを削除すると、クリーンアップするのもよいでしょう。