淘汰模板:自己的绑定上下文,相同的父级

Knockout Template: Own BindingContext, same Parents

本文关键字:上下文 自己的 绑定 淘汰      更新时间:2023-09-26

我正在编写一个bindingHandler,并希望创建一个与当前绑定上下文具有相同父/父上下文的绑定上下文。阅读:没有额外的绑定上下文层次结构。

背景:我写了一个对话框绑定处理程序
dom-node 有一个对话框绑定,如下所示data-bind="dialog: { childTemplate: 'childTemplateId' }"
单击后,将呈现通用对话框模板并将其附加到正文。您还可以指定一个子模板(= 是所需的具体视图),该子模板由绑定上下文变量$childTemplateName的通用对话框模板选择。
子模板应该不知道,在它和包含对话框绑定处理程序的级别之间有一个额外的层(= 通用对话框模板)。所以$parent$parent.$parent$parent.$parent.$parent ,...在子模板和具有data-bind="dialog: ..."的 dom 节点中是相同的。

想要一个额外的绑定上下文,以便我可以使用特定于此"对话框调用"的属性来扩展它,这样当前的绑定上下文就不会受到污染。

好吧,似乎

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,不会污染对话框绑定之外的上下文。