1

我想做一个自定义的 bindingHandler,比如data-bind="withSmartForm: formModel".

但是尽管有所有其他功能,我希望它的行为类似于with,因此当前上下文更改为 formModel,并且我可以访问子属性,例如data-bind="value: email".

我知道有一些变通方法,比如总是用 formModel 为子属性添加前缀,或者将 awith: formModel放在父元素中,但是由于我会经常使用这种模式,所以我希望它尽可能短。

在下面的小提琴中,我想将withand合并withSmartForm到一个 bindingHandler 中。

http://jsfiddle.net/k89Fg/1/

有任何想法吗?谢谢!

更新:工作示例

http://jsfiddle.net/k89Fg/4/ - 感谢 Andrew Walters 的获奖答案!

4

1 回答 1

7

这在此处的文档中进行了描述:http: //knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

来自文档: with 和 foreach 等绑定在绑定上下文层次结构中创建了额外的级别。这意味着它们的后代可以使用 $parent、$parents、$root 或 $parentContext 访问外部级别的数据。如果您想在自定义绑定中执行此操作,则不要使用 bindingContext.extend(),而是使用 bindingContext.createChildContext(someData)。

例子:

ko.bindingHandlers.withProperties = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        // Make a modified binding context, with a extra properties, and apply it to descendant elements
        var newProperties = valueAccessor(),
            childBindingContext = bindingContext.createChildContext(viewModel);
        ko.utils.extend(childBindingContext, newProperties);
        ko.applyBindingsToDescendants(childBindingContext, element);

        // Also tell KO *not* to bind the descendants itself, otherwise they will be bound twice
        return { controlsDescendantBindings: true };
    }
};
于 2013-07-13T13:19:18.507 回答