Как я могу динамически добавлять привязки элементов?

Если у меня есть пользовательская привязка, которая объединяет другие, например:

ko.bindingHandlers.binding1 = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var ctx = ko.utils.unwrapObservable(valueAccessor());

        ko.applyBindingsToNode(element, { 'binding2': ctx });        
        ko.applyBindingsToNode(element, { 'binding3': ctx });        
    }
};

«allBindingsAccessor» возвращает только текущую привязку в своей функции инициализации.

Я ожидал, что он вернет привязку 1 и привязку 2 в функции «инициализации» привязки 2 и привязку 1, 2 и 3 в функции «инициализации» привязки 3.

Следующая скрипка показывает поведение, о котором я упоминал. http://jsfiddle.net/J3sjq/5/

Проблема в том, что моя привязка3 зависит от наличия других привязок, например, привязки2.

Каков наилучший способ реализовать такое поведение? Я думал об изменении контекста, чтобы сообщить о наличии других привязок, но это звучало немного как хак.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я обновил свою скрипку, чтобы показать больше исходной проблемы, я пытался упростить, но, возможно, перестарался.

http://jsfiddle.net/J3sjq/6/

В новой скрипке привязка1 заменена на initFieldStatus, которая инициализирует 3 других сложных привязки, каждая из которых вычисляет состояние поля ввода, привязка isInputAtWarning зависит от других привязок, объявленных для элемента.

Надеюсь, это прояснит вопрос.

Спасибо.

РЕДАКТИРОВАТЬ 2:

Я предоставил скрипку с более реальным примером того, что я пытаюсь реализовать.

http://jsfiddle.net/J3sjq/8/


person Ricardo Medeiros Penna    schedule 02.12.2013    source источник
comment
Пожалуйста, покажите больше кода. До сих пор кажется, что у вас есть ситуация, когда ваши привязки, независимо от того, зависимые они или нет, должны быть объявлены в вашем начальном ko.applyBindings, и эта попытка объявить их через bindingHandler просто причиняет вам боль.   -  person beauXjames    schedule 02.12.2013
comment
Спасибо, только что обновил вопрос, чтобы добавить больше деталей.   -  person Ricardo Medeiros Penna    schedule 03.12.2013
comment
Возможно, вы неправильно понимаете назначение bindingHandler. Это не то, что вы применяете к узлам так, как вы пытаетесь. Однако вы можете складывать привязки к вашему элементу так же, как вы делаете с initFieldStatus и значением. Ваша цель здесь размыта. Может быть, вы окажете своим читателям услугу, объяснив, что вы пытаетесь сделать, а не то, что вы делаете. Для этого достаточно предоставить jsFiddle.   -  person beauXjames    schedule 03.12.2013
comment
allBindingsAccessor дает доступ только к привязкам, примененным одновременно. Когда вы вызываете ko.applyBindingsToNode, эти привязки отличаются от любой другой операции привязки.   -  person Michael Best    schedule 03.12.2013
comment
@MichaelBest Знаете ли вы, как я могу получить привязки, уже примененные к узлу? Это возможно?   -  person Ricardo Medeiros Penna    schedule 03.12.2013
comment
@beauXjames Я немного изменю вопрос с помощью новой скрипки, но решение проблемы для меня менее важно, чем понимание рассматриваемого вопроса, то есть как я могу получить привязки, уже примененные к узлу, чтобы я мог имеют привязки, зависящие от наличия другой привязки.   -  person Ricardo Medeiros Penna    schedule 03.12.2013
comment
@RicardoMedeirosPenna, я предполагаю, что когда вы говорите «узел», вы имеете в виду элемент в своей DOM. В этом случае, если вы можете собрать свой узел через jquery или js или что-то еще, попробуйте ko.dataFor или ko.contextFor(element)... вы узнаете, что элемент привязан к нокауту, если к нему добавлено свойство __ko__XXXXXXXXXX. Это. В этот момент вы можете собрать привязки и тогда будете знать, что элемент фактически был инициализирован с помощью нокаута.   -  person beauXjames    schedule 04.12.2013


Ответы (1)


Вместо вызова ko.applyBindingsToNode вы можете напрямую вызвать функцию init привязки.

ko.bindingHandlers.isInputAtWarning.init(
    element, function() { return observable.isInputAtWarning }, 
    allBindingsAccessor, viewModel, bindingContext);

http://jsfiddle.net/mbest/J3sjq/9/

Но если вы вызываете это только напрямую, вы можете просто сделать это функцией.

function isInputAtWarning(element, value, allBindingsAccessor) {
    ...
}

...    

isInputAtWarning(element, observable.isInputAtWarning, allBindingsAccessor);
person Michael Best    schedule 03.12.2013
comment
Спасибо, это то, что я искал. Не накапливается с другими добавленными/инициированными привязками, но я могу это адаптировать. Для будущих читателей и в знак уважения к @beauXjames, его вопросы заставили меня задуматься и отказаться от идеи зависимой привязки для примера из реального мира. привязка значений, таким образом они могут проверять правила проверки, я оставил зависимые привязки для более крайних случаев. - person Ricardo Medeiros Penna; 04.12.2013