Найти наблюдаемое из поля ввода

Когда ввод получает фокус, я хочу вывести предупреждение, если ввод недействителен. Сообщение находится в наблюдаемом.

Итак, учитывая этот код, как мне найти наблюдаемую, связанную с ним.

$(document).on("focus", "input.invalid", function(){
        console.log("ahaaaa!");
        //your code here
        //dig out observable from this and find the message
        //create element with class invalid-message and place it next to this
    }).on("blur", function(){
        $(".invalid-message").remove();
    });

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

РЕДАКТИРОВАТЬ: Когда я использую dataFor:

    $(document).on("focus", "input.invalid", function(){
        console.log(this);
        console.log(ko.dataFor(this));
        ...

Я получаю это в консоли:

Скриншот консоли

Подчеркнутая наблюдаемая - это то, что мне нужно.

EDIT2: я работаю над этим следующим образом:

    $(document).on("focus", "input.invalid", function(){
        var fieldName = $(this).attr("name");
        var errorMessage = ko.dataFor(this)[fieldName].error;
        ...

person Gunslinger    schedule 04.10.2013    source источник


Ответы (2)


Вы можете использовать:

ko.dataFor(this)

который даст вам наблюдаемое текущего элемента.

Дополнительные сведения см. здесь: Использование ненавязчивых обработчиков событий

person George Mavritsakis    schedule 04.10.2013
comment
Спасибо, но я не могу получить наблюдаемое для поля. Я получаю родителя (наблюдаемый для всей формы). - person Gunslinger; 04.10.2013
comment
из того, что я вижу, вы получаете SupplierObservable, в котором есть наблюдаемое имя поставщика? Итак, почему вы не получаете необходимые наблюдаемые данные: var needObervable = ko.dataFor(this)().supplierName; - person George Mavritsakis; 04.10.2013
comment
Я могу обойти это, установив имя наблюдаемого в качестве имени поля. Но я надеюсь, что это не единственный способ. - person Gunslinger; 04.10.2013
comment
да, но внутри SupplierObservable есть несколько наблюдаемых, каждая из которых привязана к полю ввода. Какой из них выбрать каждый раз. - person Gunslinger; 04.10.2013
comment
Ага, теперь понял! Да, я полагаю, что лучшее, что я могу придумать, это получить obervalbe по имени, как вы уже заметили. Что-то вроде: var needObervable = ko.dataFor(this)()[this.getAttribute(name)]; - person George Mavritsakis; 04.10.2013

Почему бы просто не использовать привязку Knockout event для настройки обработчиков focus и blur? Ваши обработчики будут вызываться со значением ввода в качестве первого параметра; не нужно играть с jQuery.

person ebohlman    schedule 04.10.2013
comment
Вы имеете в виду, что мне придется писать data-bind=event : { focus : functionX, blur : functionY} в каждом поле? Нет, спасибо. Если я неправильно понимаю, пожалуйста, скажите мне. :) - person Gunslinger; 05.10.2013
comment
Вы можете создать пользовательскую привязку: на самом деле документация Knockout для пользовательских привязок включает пример, который очень близок к тому, что вы хотите (в разделе «Изменение наблюдаемых после событий DOM»). - person ebohlman; 05.10.2013
comment
Мне по-прежнему требуется добавить привязку к каждому полю ввода. Или я неправильно понимаю? Я пишу своего рода библиотеку для своей компании и хочу, чтобы проверка работала без каких-либо действий пользователя. - person Gunslinger; 05.10.2013