Как получить доступ к $parent или $parents [] в событии clickmodel для нокаута?

У меня есть ситуация, когда я хотел бы уведомить дедушку или родителя [1] о событии клика, который встречается в модели sub view. Поэтому в основном я хотел бы иметь возможность сделать это

self.$parents[1].actionTaken

Я думаю, что это не работает из-за привязки контекста vs viewModel, но я хотел бы услышать, есть ли у кого-нибудь идеи относительно правильного способа сделать что-то подобное. Благодаря

 self.save = function () {

     //do stuff to self first, then

      self.$parents[1].actionTaken();

};

Ответы

Ответ 1

В качестве альтернативы вы можете передать параметры обработчику событий модели просмотра следующим образом: Измените свой метод save

self.save = function(theParents) {
    theParents[1].actionTaken();
}

и привяжите обработчик следующим образом:

data-bind="click: function() { $data.save($parents) }"

Для получения дополнительной информации см. Примечание 2 в документации по обработчику кликов (вам нужно немного свернуть)

Ответ 2

Или используйте трюк bind

data-bind="click: $parent.foo.bind($parent)"

Теперь, когда вы получаете доступ к своей функции foo, ключевое слово this будет указывать на родительский контекст.

foo: function(child) {
   this.children.remove(child);
}

Ответ 3

В настоящее время (с использованием knockout 3.0.0) можно просто добавить два параметра дочерней функции (выполняемые привязкой кликов), первой будет назначена текущая модель просмотра, а второй будет назначена args события click.

Затем вызовите ko.contextFor() и передайте цель события, и у вас будет доступ к $parent через объект контекста.

this.myChildFunction = function (vm, e) {
  var context = ko.contextFor(e.target);
  context.$parent.myParentFunction();
};

(не знаю, было ли это возможным во время других ответов...)

Ответ 4

На самом деле, действия определяются в viewmodel в мире нокаутов. И данные $parents/$являются "контекстом". Я создаю структуру данных, чтобы продемонстрировать ваши потребности. Компания > Отдел продаж > Сотрудники

Вы можете найти это в этом примере jsfiddle: вызывать действие root в дочернем событии

Если вы по-прежнему хотите сделать это по какой-либо причине, вы также можете определить функцию actionTaken() в контексте бабушки и дедушки (не как метод viewmodel). Но это может быть не обычным способом. Что бы ни случилось, проверьте это:

self.company={name:'ABC', click:function(){self.onCompClicked();}, salesDepartment:{manager:'Mgr',employees:['Smith','John']}};

Затем измените событие привязки привязки на это:

data-bind="text: $data, click: $parents[1].click"

Обновленный код 2-го издания находится здесь: вызывать действие контекста в дочернем событии