javascript – KnockoutJS验证与动态可观察

前端之家收集整理的这篇文章主要介绍了javascript – KnockoutJS验证与动态可观察前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用这个插件 https://github.com/ericmbarnard/Knockout-Validation,我试图验证一个动态加载的对象.

使用Javascript:

  1. function VM() {
  2. var self = this;
  3. // This is a static observable,just to ensure that basic validation works fine.
  4. self.static = ko.observable();
  5. self.static.extend({required: true});
  6.  
  7. // This is the observable that will be updated to my model instance.
  8. self.person = ko.observable({});
  9.  
  10. // This is an handler for manual trigger.
  11. // I'm not even sure this is needed.
  12. self.a = function(){
  13. self.errors.showAllMessages();
  14. self.staticErrors.showAllMessages();
  15. }
  16.  
  17. // Here i'm loading current person from somewhere,i.e. a rest service.
  18. self.load = function() {
  19. // Update observable
  20. self.person(new Model());
  21.  
  22. // Define validation rules
  23. self.person().name.extend({required: true});
  24. self.person().email.extend({required: true});
  25.  
  26. // Set person data
  27. self.person().name('Long');
  28. self.person().email('John');
  29.  
  30. // Set validators
  31. self.errors = ko.validation.group(self.person);
  32. self.staticErrors = ko.validation.group(self.static);
  33. }
  34. }
  35.  
  36. // Just a test model.
  37. function Model() {
  38. this.name = ko.observable();
  39. this.email = ko.observable();
  40. }
  41.  
  42. ko.validation.init();
  43. var vm = new VM();
  44. ko.applyBindings(vm);

标记

  1. <ul>
  2. <li>1. Hit "Load"</li>
  3. <li>2. Hit "Show errors",or maunally change input data.</li>
  4. </ul>
  5. <button data-bind='click: load'>Load</button>
  6. <br/>
  7.  
  8. <h1>This is working properly.</h1>
  9. <input type='text' data-bind='value: static' />
  10. <br/>
  11.  
  12. <h1>This is not working.</h1>
  13. <input type='text' data-bind='value: person().name' />
  14. <input type='text' data-bind='value: person().email' />
  15. <br/>
  16. <button data-bind='click: a'>Show errors</button>

小提琴
http://jsfiddle.net/qGzfr/

我该如何使这项工作?

解决方法

验证插件仅在您的绑定中应用,只有当Knockout解析绑定时,您的属性才会生效.

用不同的单词:在UI上绑定该属性之后,您无法向属性添加验证.

在你的例子中,你在self.person = ko.observable({})中使用一个空的对象;作为默认值,因此当Knockout执行data-bind =’value:person().name’表达式时,您没有name属性,因此即使以后将name属性添加到对象中,验证也将不起作用.

在您的示例中,您可以通过更改Model构造函数解决此问题,以包括验证规则:

  1. function Model() {
  2. this.name = ko.observable().extend({required: true});
  3. this.email = ko.observable().extend({required: true});
  4. }

并使用一个空的Model对象作为默认的人:

  1. self.person = ko.observable(new Model());

调用Load不要替换person对象但更新其属性时:

  1. self.load = function() {
  2.  
  3. // Set person data
  4. self.person().name('Long');
  5. self.person().email('John');
  6. }

演示JSFiddle.

注意:如果将整个对象替换为self.person(new Model()),Knockout并不总是很好处理;所以无论如何,一个更好的做法是只更新属性,而不是丢弃整个对象.

一个不同的解决方案是使用with绑定,因为在绑定绑定KO将重新评估绑定,如果绑定的属性改变.

所以改变你的看法:

  1. <!-- ko with: person -->
  2. <input type='text' data-bind='value: name' />
  3. <input type='text' data-bind='value: email' />
  4. <!-- /ko -->

在这种情况下,您需要使用null作为默认的人:

  1. self.person = ko.observable();

在您的加载中,您需要在分配您的人员属性之前添加验证,以便KO应用您的属性具有验证的绑定:

  1. self.load = function() {
  2.  
  3. var model = new Model()
  4.  
  5. model.name.extend({required: true});
  6. model.email.extend({required: true});
  7.  
  8. self.person(model);
  9.  
  10. // Set person data
  11. self.person().name('Long');
  12. self.person().email('John');
  13. }

演示JSFiddle.

猜你在找的JavaScript相关文章