2012-01-18 10 views
5

Tôi đã gặp phải một hành vi lạ của xác nhận mẫu trong Backbone.js.Xác thực mô hình xương sống

Khi một mô hình đầu tiên được tạo ra, như

var foo = new Foo({ 
    bar: 42 
}); 

Backbone gọi foo.set() đi qua như một tham số bản đồ cho {bar: 42}, như người ta có thể nhìn thấy từ source. Bằng cách đó, nó cũng vượt qua tùy chọn {silent: true}, như trong dòng

this.set(attributes, {silent : true}); 

này có ý nghĩa, kể từ khi có silent === true tránh kích hoạt các change sự kiện, mà không có ý nghĩa trong bối cảnh này.

Vì một số lý do tôi không thể hiểu được, tuy nhiên, silent === true cũng ngăn xác thực; thấy rõ nguồn gốc tại dòng

if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false; 

Vì vậy, nó xuất hiện mô hình là bao giờ xác nhận khi chúng được tạo ra, nhưng họ thường là khi một số thuộc tính được thay đổi. Hơn nữa, sự hiện diện của việc xác nhận là gắn bó chặt chẽ với hành động gửi các sự kiện change, đó là một cái gì đó hoàn toàn trực giao.

Mọi người có thể giải thích lý do tại sao điều này không? Điều gì sẽ là một bằng chứng rõ ràng và trong tương lai để khắc phục vấn đề này?

tôi bằng tay có thể gọi _performValidation, nhưng điều này có hai nhược điểm:

  • đầu tiên, nó là một cái gì đó tôi chỉ đơn giản có thể quên
  • thứ hai, _performValidation không phải là một phần của API và có thể nó sẽ thay đổi trong các bản phát hành trong tương lai.

Trả lời

3

Thực ra tôi nghĩ đó là lỗi trên Backbone.JS.

Có một vấn đề mở trên GitHub ở đây: https://github.com/documentcloud/backbone/issues/870

Edit: Trong phiên bản mới 0.9.1 của Backbone.js, bạn có thể kiểm tra xem mô hình có giá trị với phương pháp isValid (http://backbonejs.org/#Model-isValid)

+0

Ok, cảm ơn bạn, tôi nghĩ rằng tôi đã thiếu một cái gì đó – Andrea

+1

Phiên bản 0.9.9 Cập nhật: Xác thực bây giờ xảy ra ngay cả trong những thay đổi "im lặng".Thay đổi này có nghĩa là phương thức isValid đã được gỡ bỏ. Xác thực không thành công cũng kích hoạt lỗi, ngay cả khi một lỗi gọi lại được chỉ định trong các tùy chọn. – romanlv

0

hiện tại, cách duy nhất để giữ an toàn là không bao giờ chuyển thông số băm.

tôi luôn luôn làm:

var m = new MyModel(); 
// and then I do all the sets 
m.set(...); 
m.set(...); 
m.set(...); 

Trong trường hợp một số dữ liệu JSON xuất phát từ DB, sau đó chúng được cho là đã được xác nhận đã và như vậy trong trường hợp đó nó là tốt để:

var m = MyMOdel(hashFromDB); 

Điều đó có ý nghĩa?