Получить элемент, который наблюдаемый связан с нокаутом?
Это не идеальная ситуация, но из-за другой привязки нокаута я использую Я в ситуации, когда мне нужно, чтобы элемент, наблюдаемый связан, был связан, если он действительно привязан ко всему.
Итак, есть ли способ сделать это?
== Обновление ==
Я не хотел добавлять лишний контекст, если он смущает вопрос, но поскольку он может получить ответ в соответствии с ожиданиями, вот сценарий.
Я использую привязку проверки нокаута, которая предоставляет все ошибки с использованием метода 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.