удаление родителя в функции нокаута из вложенного цикла

На мой взгляд, я перебираю observableArray (itemGroup), у которого есть одно свойство, которое также является observableArray (item). У меня есть метод для удаления всей itemGroup и один для удаления элемента из и itemGroup, но я хотел бы добавить некоторую логику в соответствии с ней, в группе остался только 1 элемент, удаление этого элемента также должно удалить itemGroup.

вот пример соответствующих частей моей модели представления и представления.

my 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.


person BillPull    schedule 19.02.2013    source источник


Ответы (1)


Я хотел бы предложить свое решение

отправить индекс itemGroups и элементов в качестве аргумента для удаления метода.

Надеюсь, вы знаете, как отправить индекс

Затем проверьте длину 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);

  }
 };
person NaveenKumar1410    schedule 20.02.2013
comment
как я могу ссылаться на это, на мой взгляд? можно ли обойтись без использования анонимной функции? - person BillPull; 20.02.2013
comment
невозможно. вы должны использовать любую из этих анонимных функций или видимую привязку или то, что вы сделали - person NaveenKumar1410; 26.02.2013