Нахождение родителя наблюдаемого массива - PullRequest
3 голосов
/ 27 февраля 2012

Я пытаюсь преобразовать свой проект, чтобы использовать плагин Райана Нимейера для перетаскивания (http://www.knockmeout.net/2012/02/revisiting-dragging-dropping-and.html).

Когда элемент перетаскивается в другую группу, мне нужно установить свойство перетаскиваемого элемента на основе объект, который содержит observableArray, в который он перетаскивается в .

У меня есть viewModel в виде строк:

  • viewModel
    • TopLevelObject
      • Children (a observableArray)
        • Child A, родительское свойство которого установлено в TopLevelObject
        • Child B, родительское свойство которого равноустановлено значение TopLevelObject
          • Child of Child B (a observableArray)
            • Child X, родительское свойство которого имеет значение Child B
            • Child Yчье родительское свойство установлено в значение Child B

Это родительское свойство, которое мне нужно установить. У меня есть доступ к arg.targetParent, который является observableArray 'Children' впример выше.Поэтому я думаю, что решение будет выглядеть примерно так:

ko.bindingHandlers.sortable.afterMove = function(arg) {
    // how do I get the object that contains the arg.targetParent observable array??
    var parentOfTargetObservableArray = /* the containing object of arg.targetParent */                    
    arg.item.MyParent(parentOfTargetObservableArray);
}

Учитывая observableArray изолированно, есть ли способ найти объект, который содержит его ???

Ответы [ 2 ]

4 голосов
/ 27 февраля 2012

Вы не можете напрямую добраться до родителя объекта observableArray, не оставляя дальнейших подсказок об объектах.Это можно сделать несколькими способами:

-Добавить родительский объект в качестве свойства вашего observableArray.observableArrays - это функции, которые являются объектами, поэтому вы можете добавить к ним свойства, например:

this.Children = ko.observableArray(...);
this.Children.parent = parent;

Затем вы можете просто прочитать свойство parent из arg.targetParent

- иначеЕсли вы можете получить доступ к объекту более высокого уровня (возможно, он уже является глобальным), то вы можете просмотреть циклы дочерних элементов верхнего уровня и проверить, если topLevelChild.Children === arg.targetParent

Если вам нужны примеры кода, дайте мне знать.

0 голосов
/ 27 февраля 2012

Knockout предоставляет функцию, которая позволяет вам дать ему элемент DOM, и он найдет ближайшего родителя для нокаута. Функция называется ko.dataFor(). Вы можете увидеть пример здесь: Использование ненавязчивых обработчиков событий

Вот быстрый взлом вашего кода, не проверенный, но демонстрирующий использование dataFor:

ko.bindingHandlers.sortable.afterMove = function(arg) {
    var parentOfTargetObservableArray = ko.dataFor(arg.targetParent);
    arg.item.MyParent(parentOfTargetObservableArray);
}
...