Доступ к нокаутирующей привязке из дочернего элемента

Допустим, у меня есть это:

<div data-bind="enable: false">
    <div data-bind="someCustomBinding: myValue"></div>
</div>

Могу ли я получить доступ к привязке «включить» родительского контейнера из пользовательской привязки?

== Пояснение: ==

В пользовательской привязке вы можете получить доступ к текущему значению привязки с помощью метода valueAssessor. вы также можете получить доступ к другим привязкам через allBindings и даже к значениям в различных связанных контекстах через метод bindingContext.

Мне просто интересно, можете ли вы получить доступ к привязке родительского элемента html из пользовательской привязки (аналогично valueAccessor)

Что-то вроде этого (код sudo):

ko.bindingHandlers.someCustomBinding=
{
    init: (element, valueAccessor, allBindings) =>
    {
        var parentIsEnabled = 
             ko.GetContextFor($(element).parent()).get('enable');
    }
}

person 4imble    schedule 16.04.2014    source источник
comment
вы пытаетесь увидеть, включен/отключен ли родительский элемент, или вам нужен доступ к какому-либо значению привязки, а enable просто является примером, который вы используете здесь?   -  person Chuck Schneider    schedule 17.04.2014
comment
Я хочу получить значение привязки, и в этом примере только что используется enable.   -  person 4imble    schedule 17.04.2014
comment
Я предполагаю, что вам нужно текущее нокаутирующее значение привязки, а не выражение в привязке?   -  person Chuck Schneider    schedule 17.04.2014
comment
Чтобы уточнить.. если у вас было enable: vmObservableProperty Вы хотите знать, что enable привязано к vmObservableProperty или что enable в настоящее время истинно или ложно?   -  person Chuck Schneider    schedule 17.04.2014
comment
Добавил немного информации, подозреваю, что это невозможно (без грязных хаков)   -  person 4imble    schedule 22.04.2014
comment
Итак, почему бы не получить родительский элемент ($(element).parent()) и просто использовать jQuery, чтобы увидеть, включен ли он или любой другой атрибут, который вы хотите?   -  person Chuck Schneider    schedule 22.04.2014


Ответы (2)


Вы можете получить доступ к родительскому узлу и проанализировать его атрибут data-bind:

JSON.parse('{' + $(element).parent().data("bind") + '}')

Не забудьте поставить двойные кавычки (") в определение привязки, как показано ниже jsFiddle

К сожалению, я не могу найти более элегантный способ сделать это.

KO позволяет вам получить доступ к модели представления элемента dom с помощью dataFor/contextFor, но я не вижу никакого способа получить определение привязки элемента dom.

EDIT: после дальнейшего изучения вы можете получить доступ к родительской привязке с помощью следующего:

ko.bindingProvider.instance.getBindings($(element).parent().get(0), bindingContext)

Он вернет объект с привязками. Например, если вы объявите data-bind="style: { backgroundColor: myBackgroundColor }", вы сможете получить доступ к наблюдаемому через ko.bindingProvider.instance.getBindings($(element).parent().get(0), bindingContext).style.backgroundColor

Единственная проблема заключается в том, что вы не можете получить наблюдаемое имя в модели представления (или, по крайней мере, я не знаю, как это сделать, за исключением случаев, когда вы сравниваете каждое свойство с вашей моделью представления, например идиома для сравнения нокаутирующих наблюдаемых)

person GôTô    schedule 17.04.2014
comment
Это скажет вам, к какому выражению привязана каждая привязка, но не значение оцениваемого выражения во время выполнения. Я не уверен, хочет он этого или нет. - person Chuck Schneider; 17.04.2014
comment
@ChuckSchneider Я считаю, что в этом суть: значение является константой, а не наблюдаемой - person GôTô; 17.04.2014
comment
В ответ на мой комментарий выше он сказал, что это просто пример. Так что я не уверен, что это так. - person Chuck Schneider; 17.04.2014
comment
Предназначен для добавления... вы также можете использовать $(element).parent().data(bind) вместо этого, чтобы получить привязку данных. - person Chuck Schneider; 17.04.2014
comment
@ChuckSchneider Это работает, спасибо за совет, я не знал. Обновленный ответ - person GôTô; 17.04.2014
comment
Извиняюсь за мой пример, трудно разместить что-то там, для чего люди не предоставляют обходные пути :). Я бы хотел значение привязки, что означало бы, что я мог бы затем поменять его на любую другую наблюдаемую или константу, и это все равно будет работать, если это имеет смысл? - person 4imble; 22.04.2014
comment
+1 Честно говоря, он делает то, что я просил, просто не совсем то, что я хотел. - person 4imble; 22.04.2014

да. Параметр bindingContext функций пользовательских привязок init и update предоставляет доступ к $parent, $parents и $root. .

person PatrickSteele    schedule 16.04.2014
comment
Кажется, это дает мне доступ к связанным моделям просмотра, а не к самому значению привязки. Я хочу, чтобы значение, присвоенное «включить», в этом случае было ложным. Я неправильно понимаю, как использовать $parent? - person 4imble; 16.04.2014
comment
О, я вижу. Извините -- я неправильно понял. Я не знаю, существует ли что-то подобное. Не могли бы вы обновить вопрос, указав более конкретный пример того, что вы пытаетесь решить? Может быть нокаутирующий способ сделать это. - person PatrickSteele; 16.04.2014