Порядок сортировки нокаут привязки


Это продолжение вопроса: KnockoutJS Сортируемая группа observableArray по полю и условно сортировка

Есть еще две вещи, за достижение которых я борюсь. Во-первых, когда вложенный элемент списка перетаскивается в другой список, оставляя родительский элемент пустым, я хотел бы удалить родительский элемент. Я сделал это, создав функцию afterMove и проверив, равна ли длина sourceParent 0. Затем я просматриваю маршруты, чтобы увидеть, есть ли у них пустой массив задач, и удаляю соответственно. Я хотел бы знать, является ли это эффективным решением. Я также должен удалить задачи, иначе подписка на задачи добавляет дубликаты при удалении запланированных задач.

Во-вторых, и это самое главное, базовый объект (задача) имеет свойство порядка. Я хотел бы привязать это к сортируемому порядку, чтобы при перетаскивании задач по списку запланированных свойство order обновлялось. Как получить доступ к порядку других элементов списка из сортируемого обратного вызова?

Пожалуйста смотрите ниже этускрипку .

Любая помощь будет весьма признательна.

1 2

1 ответ:

Для первого выпуска есть немного оптимизированный способ, которым вы могли бы это сделать. arg.sourceParent содержится в элементе tasksByRoute, который вы хотите удалить. Функция remove может использовать функцию для запуска с элементами. Итак, вы можете написать его так:

self.afterMoveCallback = function(arg) {
    if (arg.sourceParent().length === 0) {
        self.tasksByRoute.remove(function(route) {
           return route.tasks === arg.sourceParent; 
        });
    }
};

Для второго вопроса мне очень нравится использовать расширение, которое будет автоматически отслеживать порядок в observableArray. Это будет выглядеть примерно так:

//track an index on items in an observableArray
ko.observableArray.fn.indexed = function(prop) {
    prop = prop || 'index';
   //whenever the array changes, make one loop to update the index on each
   this.subscribe(function(newValue) {
       if (newValue) {
           var item;
           for (var i = 0, j = newValue.length; i < j; i++) {
               item = newValue[i];
               if (!ko.isObservable(item[prop])) {
                  item[prop] = ko.observable();
               }
               item[prop](i);  //add 1 here if you don't want it to be zero based
           }
       }   
   }); 

   //initialize the index
   this.valueHasMutated(); 
   return this;
};

В вашем случае вы бы использовали его следующим образом:

self.scheduledTasks = ko.observableArray([
    new Task(8, 4, "Route 4", "Cust 8", 1),
    new Task(9, 4, "Route 4", "Cust 9", 2),
    new Task(10, 5, "Route 5", "Cust 10")
    ]).indexed("order");

Здесь есть пример обновлен с обоими этими изменениями: http://jsfiddle.net/rniemeyer/usVKQ/