Порядок сортировки нокаут привязки
Это продолжение вопроса: KnockoutJS Сортируемая группа observableArray по полю и условно сортировка
Есть еще две вещи, за достижение которых я борюсь. Во-первых, когда вложенный элемент списка перетаскивается в другой список, оставляя родительский элемент пустым, я хотел бы удалить родительский элемент. Я сделал это, создав функцию afterMove и проверив, равна ли длина sourceParent 0. Затем я просматриваю маршруты, чтобы увидеть, есть ли у них пустой массив задач, и удаляю соответственно. Я хотел бы знать, является ли это эффективным решением. Я также должен удалить задачи, иначе подписка на задачи добавляет дубликаты при удалении запланированных задач.Во-вторых, и это самое главное, базовый объект (задача) имеет свойство порядка. Я хотел бы привязать это к сортируемому порядку, чтобы при перетаскивании задач по списку запланированных свойство order обновлялось. Как получить доступ к порядку других элементов списка из сортируемого обратного вызова?
Пожалуйста смотрите ниже этускрипку .
Любая помощь будет весьма признательна.
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/