2015-10-28 2 views
0

Я новичок в knockoutjs. У меня есть две формы, которые имеют одну и ту же модель. Я пытаюсь проверить некоторые входы и т. Д. Форма имеет похожие поля ввода, но у них разные идентификаторы. Проблема в том, что когда я печатаю что-то в почтовом индексе первой формы, результат всегда появляется во второй форме. Есть ли что-то, что я могу сделать?valueUpdate события применяются на нескольких viewmodel knockoutjs

http://jsfiddle.net/gZC5k/3208/

<form id="c1"method="post" action="" > 
<input name="zipcode" type="text" id="zipcode" data-bind="value: zipcode, valueUpdate: ['keyup', 'blur']" > 
</form> 

<form id="c2" method="post" action=""> 
<input name="zipcode" type="text" id="zipcode" data-bind="value: zipcode, valueUpdate: ['keyup', 'blur']"> 
</form> 

var Contact = function(id) { 
    var self = this; 
    ko.validation.rules['mustEqual'] = { 
     async: true, 
     validator: function (val, otherVal, callback) { 
      $(id).append("result"); 
     }, 
     message: 'The field must equal {0}' 
    }; 

    ko.validation.registerExtenders(); 
    self.zipcode = ko.observable(12).extend({ mustEqual: 5 }); 

}  
ko.applyBindings(new Contact(document.getElementById("c1")),document.getElementById("c1")); 
ko.applyBindings(new Contact(document.getElementById("c2")), document.getElementById("c2")); 
+0

Что вы пытаетесь проверить? вы пытаетесь проверить, введен ли введенный zipcode, к определенному постоянному номеру?? –

+0

это не моя проблема, проверьте ссылку jsfiddle, и у вас возникнет проблема. Когда я набираю первое поле ввода, он показывает мне сообщение во втором. но я хочу это в первом. Поэтому, когда я ошибаюсь в первом входе [первая форма], я хочу получить сообщение в первой форме. то же самое для второго входа –

+0

возникает пара проблем ... в вашем коде валидатор должен указывать на метод обратного вызова, который возвращает true или false, указывающий, что проверка прошла неудачно или нет. вы добавляете туда манипуляции DOM. еще одна вещь ... регистрация валидатора должна быть глобальной вещью, которую вы добавляете в определение модели вашего представления ... делая регистр фрейма каждый раз, когда вы создаете модель представления, не уверен, что это поможет .. http: // jsfiddle. net/ppcoj20n/2/ –

ответ

2

При выполнении этой строки

ko.applyBindings(new Contact(document.getElementById("c2")), document.getElementById("c2")); 

Ваше мнение модель заменяет старое правило c1 проверки с c2 виде ссылки, таким образом, всегда выполняя последний зарегистрированный валидатор, который в вашем кейс - c2. Если изменить порядок отчетности по состоянию

ko.applyBindings(new Contact(document.getElementById("c2")), document.getElementById("c2")); 
ko.applyBindings(new Contact(document.getElementById("c1")), document.getElementById("c1")); 

вы увидите, что он будет добавлять с form#c1 тогда. Поэтому переместите регистрацию правил вне своей модели просмотра.

Также, если вы устанавливаете флаг async на номер true, тогда вы должны использовать функцию callback. Что-то вроде

validator: function (val, otherVal,callback) { 
     callback(val == otherVal); 
     //$(id).append("result"); 
    }, 

JsFiddle

Смежные вопросы