Получить элемент, к которому относится наблюдаемый с Knockout? - PullRequest
14 голосов
/ 27 февраля 2012

Это не идеальная ситуация, но из-за другого связывающего нокаута, который я использую, я нахожусь в ситуации, когда мне нужно получить элемент, с которым связан наблюдаемый объект, если он действительно связан с чем-либо.

Так есть ли способ сделать это?

== Обновление ==

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

Я использую привязку валидации, которая выявляет все ошибки, используя метод ko.validation.group(model). Однако проблема в том, что only дает вам текстовые ошибки, но не дает никакого контекста относительно того, какая часть модели выдает вам эти ошибки. Поэтому я внес небольшое изменение в источник, чтобы теперь возвращать наблюдаемые, привязанные к каждой ошибке, поскольку это может быть полезно для нескольких сценариев, но здесь мне нужно иметь возможность связать это с элементом, чтобы я мог отобразить некоторые встроенная проверка некоторого вида.

Knockout Validation обеспечивает очень простую встроенную проверку, в которой он создает диапазон после вашего элемента, и вы можете дать ему класс, но это слишком для моих нужд, так как в настоящее время мы используем Qtip и другие системы уведомлений для отображения проверки ошибки, и из-за этого мне нужно иметь возможность иметь элемент Dom и ошибку. Пока у меня есть наблюдаемая и ошибка, но мне нужно связать этот наблюдаемый объект (который может быть любым свойством ko.observable () из модели) с его данным элементом DOM, если у него есть привязка элемента.

Поскольку все, что у меня есть, это объект, и я использую валидацию, основанную на модели, а не на пользовательском интерфейсе, проблема на самом деле не будет решена с помощью пользовательской привязки. В идеале мне нужно иметь возможность вскрыть брак до наблюдаемого объекта (неизвестного ko.observable()) до элемента.

Не слишком специфично для проекта, но мой текущий проект абстрагирует валидацию, когда события запускаются (т.е. EventSystem.SendEvent(ValidationEvents.ValidationFailed, <element>, <error>)), тогда система валидации прослушивает эти события и связывает ошибку с элементом, будь то всплывающая подсказка, рычание уведомление о стиле, окно оповещения и т. д. Поэтому я пытаюсь найти лучший способ сохранить эту абстракцию при получении валидации из наблюдаемых моделей, а не элементов DOM пользовательского интерфейса (т. е. jquery-ui)

== Редактировать 2 ==

Меня немного поразило то, что Knockout Validation знает элементы для наблюдаемых, чтобы вставить свои собственные элементы проверки, однако они просто отбрасывают существующую привязку значений, поэтому я просто собираюсь изменить это, чтобы добавить элементы для любые элементы проверки, основанные на их методе isValidatable(), по крайней мере, таким образом, для каждой ошибки я могу связать ее с наблюдаемой, а для любых наблюдаемых с привязками элементов я могу привязать их к элементам, и если их нет, то это нормально они будут просто формами ошибок проверки. Я попробую, так как это должно быть что-то вроде (еще не проверено):

if(utils.isValidatable(valueAccessor())) {
    valueAccessor().extend({hasElementalBinding: true, elementalBinding: element});
}
else { 
    valueAccessor().extend({hasElementalBinding: false});
}

Примерно в строке 250 в registerValueBindingHandler я оставлю этот вопрос открытым на некоторое время, если у кого-то есть лучшее решение.

Ответы [ 2 ]

18 голосов
/ 30 августа 2012

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

data-bind="... myvalidationbinding: myobservable"

Затем в моем обработчике привязки я расширяю наблюдаемую

ko.bindingHandlers.myvalidationbinding = {
  init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
    valueAccessor().extend({element: element });
  }
};

И, наконец, мое расширение

ko.extenders.element = function (target, element) {
  target.DOMElement = element;
}

Теперь я могу подписаться на isValid (), заданную knockout.validation, и, если он недействителен, пойти получить элемент, с которым связана наблюдаемая, и затем манипулировать им с помощью jQuery.

5 голосов
/ 27 февраля 2012

Это будет не очень быстро, поэтому я бы определенно кэшировал результаты, но кое-что, используя селекторы атрибутов jQuery:

$('[data-bind*="Property"]')

*= - атрибут содержит селектор: http://api.jquery.com/attribute-contains-selector/

Очевидно, что это не отловит ничего, что подписано вручную с помощью метода .subscribe, но я не уверен, как вы извлечете элементы из функций в любом случае.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...