Получить элемент, который наблюдаемый связан с нокаутом?

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

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

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

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

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

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

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

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

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

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

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

Вблизи строки 250 в registerValueBindingHandler я оставлю этот вопрос открытым некоторое время, пока кто-то еще не сможет найти лучшее решение.

Ответы

Ответ 1

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

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

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

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

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

Ответ 2

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

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.