2012-06-07 26 views
8

Tôi đang cố gắng sử dụng knockout validation lib để xác thực một mảng đối tượng. Nó không phải là đơn giản đối với tôi làm thế nào để tạo thành một nhóm xác nhận cho một loạt các quan sát. Cách duy nhất tôi quản lý để làm cho nó hoạt động giống như thế này (JSFIDDLE included):Làm cách nào để xác thực một mảng?

var Note = function() { 
    var self = this; 
    self.name = ko.observable().extend({ required: true }); 
}; 

var viewModel = function() { 
    var self = this; 

    self.notes = ko.observableArray([new Note(), new Note()]); 

    self.validatedObservables = function() { 
     var arr = []; 
     ko.utils.arrayForEach(self.notes(), function(note) { 
      arr.push(note.name); 
     }); 
     return arr; 
    }; 

    self.errors = ko.validation.group(self.validatedObservables()); 

    self.submit = function() { 
     if (self.errors().length != 0) { 
      self.errors.showAllMessages(); 
     } 
    }; 

}; 

ko.applyBindings(new viewModel()); 

Dường như cách tiếp cận của tôi là không cần thiết tiết. Theo mã nguồn, bạn có thể chỉ cần chuyển một quan sát tới ko.validation.group:

self.errors = ko.validation.group(self.notes()); 

Nhưng điều này không hiệu quả.

Trả lời

14

Có tùy chọn cấu hình để nhóm được sâu (đệ quy). Nó có thể được thiết lập hoặc trên toàn cầu với ko.validation.init({ grouping: { deep: true } }) hoặc trong group gọi chính nó, ví dụ như: self.errors = ko.validation.group(self.notes(), {deep: true});

Cập nhật fiddle đây: http://jsfiddle.net/KHFn8/4116/

BTW, theo cách mà bạn đã làm nó có thể được viết dưới dạng ngắn hơn nhiều:

self.errors = ko.validation.group(
    ko.utils.arrayMap(self.notes(), function(note) { return note.name })); 

Chỉnh sửa: Fiddle của tôi không còn hoạt động với phiên bản mới nhất của xác thực KO. Đây là cùng một fiddle sử dụng phiên bản mới nhất tại thời điểm tôi đã đưa ra câu trả lời (tháng 6 năm 2012): http://jsfiddle.net/KHFn8/4117/

+0

Tuyệt vời, người đàn ông, bạn đã lưu là một ngày! Chỉ còn một điều nữa. Nó hoạt động tốt, nhưng nếu bạn thêm một thể hiện khác vào một mảng sau, nó không được bao gồm trong nhóm. [Có một cái nhìn tại fiddle này] (http://jsfiddle.net/KHFn8/340/) – Dziamid

+0

Những gì tôi thích về loại trực tiếp là nó không có ma thuật mà đứng trên con đường của bạn. Một lần nữa, tôi đã giải quyết được vấn đề của mình. Mã này là tiết nhưng hoạt động - các mục được thêm động được thêm vào để xác thực. [Fiddle] (http://jsfiddle.net/KHFn8/344/). – Dziamid

+0

-1: Fiddle này không thực hiện bất kỳ xác thực nào. –

2

Tôi có danh tiếng thấp để bình luận. Vì vậy, ở đây có một câu trả lời. Câu trả lời với các câu đố được cung cấp bởi các đường nối antishok không còn hoạt động nữa. (Các liên kết đến knockout.js đã bị hỏng, nhưng ngay cả sau khi sửa chữa và thêm một liên kết làm việc để loại bỏ 3.0 nó vẫn không hoạt động)

Tôi đã thêm ko.computed xung quanh ko.validation.group() và nhận nó làm việc theo cách đó.

self.errors = 
    ko.computed(function() { 
     return ko.validation.group(self.notes(), { deep: true })}); 

http://jsfiddle.net/bezFR/17/ (cập nhật)

Tôi đoán có một cách tốt hơn để làm điều này, nhưng bây giờ nó giải quyết vấn đề của tôi, và tôi đang mong chờ để được sửa chữa/nhìn thấy một giải pháp tốt hơn :)

Các vấn đề liên quan