1

のようなカスタム bindingHandler を作成したいと思いdata-bind="withSmartForm: formModel"ます。

しかし、他のすべての機能にもかかわらず、 のように動作するようにしたいwithので、現在のコンテキストは formModel に変更され、 のようなサブプロパティにアクセスできますdata-bind="value: email"

サブプロパティの前に常に formModel を付けたりwith: formModel、親要素に a を付けたりするなどの回避策があることは知っていますが、このパターンを頻繁に使用するので、できるだけ短くしたいと思います。

with次のフィドルでは、 andwithSmartFormを 1 つの 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 に答える