Как получить доступ к $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-го издания находится здесь:
вызывать действие контекста в дочернем событии