1

在我看来,我正在循环一个 observableArray (itemGroup),它有一个属性也是 observableArray (item)。我有一个删除整个 itemGroup 的方法和一个从 itemGroup 中删除一个项目的方法,但我想添加一些逻辑沿着它的行,组中只剩下一个项目,删除该项目也应该删除 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 语句也可以很好地清理。

4

1 回答 1

0

我想给出我的解决方案

将 itemGroups 和项目的索引作为参数发送到 remove 方法。

希望你知道如何发送索引

然后检查 itemGroups 的长度

self.remove(itemGroupsIndex,itemsIndex) {
 var itemGroupsLength = self.itemGroups()[itemGroupsIndex].items().length;
  if(itemGroupsLength = 1) {

   self.itemGroups.remove(itemGroupsIndex);

  }
  else {

   self.itemGroups()[itemGroupsIndex].items.remove(itemsIndex);

  }
 };
于 2013-02-20T13:53:42.013 回答