Шаблон нокаута: собственный BindingContext, те же родители
Я пишу bindingHandler и хочу создать связывающий контекст, который имеет те же родительские / родительские контексты, что и текущий bindingContext. Читайте: нет дополнительной обязательной контекстной иерархии.
Справочная информация: я пишу обработчик диалогового окна
Домен-узел имеет привязку диалога data-bind="dialog: { childTemplate: 'childTemplateId' }"
После щелчка универсальный шаблон диалога отображается и прикрепляется к телу. Вы также указываете дочерний шаблон (= это желаемое конкретное представление), который выбирается универсальным диалоговым шаблоном с помощью переменной связывания-контекста.$childTemplateName
,
Дочерний шаблон не должен иметь никакого представления о том, что между ним и уровнем, содержащим обработчик диалога-привязки, есть дополнительный слой (= универсальный шаблон диалога). Так $parent
, $parent.$parent
, $parent.$parent.$parent
,... одинаковы в дочернем шаблоне и dom-узле, имеющем data-bind="dialog: ..."
,
Я хочу иметь дополнительный контекст привязки, чтобы я мог расширить его свойствами, специфичными для этого "диалогового вызова", чтобы текущий контекст привязки не был загрязнен.
2 ответа
Ок, кажетсяbindingContext.$parentContext.createChildContext(childViewModel);
работает идеально!
Итак, используя $parentContext
это (на первый взгляд) логичный путь.
(если я правильно помню, я пробовал это ранее, но безуспешно с предыдущими версиями нокаута... но не берите в голову)
bindingContext.extend
возвращает новый bindingContext:
ko.bindingHandlers.dialog = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var innerBindingContext = bindingContext.extend({
dialogProperty1: ...
});
ko.applyBindingsToDescendants(innerBindingContext, element);
return { controlsDescendantBindings: true };
}
};
так что это должно сделать то, что вы пытаетесь достичь: новый bindingContext с той же иерархией и специфичными для диалога расширениями, который не загрязняет контекст вне вашей диалоговой привязки.