2012-11-26 23 views
5

Các tài liệu Backbone nói:Hiểu Backbone Mẫu bộ, xác nhận và thay đổi callbacks

Model.set sẽ thất bại nếu không xác nhận - nó sẽ không thiết lập giá trị do đó nó sẽ không kích hoạt bất kỳ callback. Chúng ta có thể chuyển {silent: true} thành Model.set - sau đó nó sẽ đặt giá trị nhưng sẽ không kích hoạt bất kỳ cuộc gọi lại nào.

Vì vậy,

Tại sao Backbone mẫu đòi hỏi một nhà nước hợp lệ để chỉ cần đặt một giá trị thuộc tính? Điều gì xảy ra nếu chúng ta muốn thiết lập các thuộc tính khi người dùng tương tác với giao diện người dùng, nhưng mô hình vẫn chưa hợp lệ? Điều đó có nghĩa là các cuộc gọi lại không có sẵn trừ khi chúng tôi vượt qua {silent: true} sau đó kích hoạt thay đổi theo cách thủ công ?!

Hãy nói rằng bạn biết một cách tốt hơn để xử lý này :)

Trả lời

3

Tôi không chắc chắn làm thế nào để trả lời các Tại sao câu hỏi nhưng bạn có thể nói rằng có những lập luận cho lý do tại sao nó là tốt mà bộ chạy xác thực. Ví dụ, nó làm cho nó chết đơn giản để làm xác nhận phía khách hàng trong thời gian thực.

Nếu sự cố của bạn có thể được giải quyết bằng cách chỉ xác thực giá trị hiện đang được người dùng thay đổi, bạn có thể thực hiện điều đó bằng cách kết hợp phương thức validate với phương pháp hasChanged.

Ví dụ một cái gì đó như thế này:

Backbone.Model.extend({ 
    defaults : { name : "" }, 

    validate : function (attrs) { 
    var errors = {}; 
    if(this.hasChanged("name") && attr.name.length == 0) { 
     errors.name = "Need a name yo!"; 
    } 
    //... 

    if(_.keys(errors).length > 0) { 
     return errors; 
    } 
    } 
}) 
+0

Cảm ơn Andrew nhưng điều đó sẽ giải quyết được sự cố và tạo một vấn đề khác: bỏ qua xác thực cho các giá trị không thay đổi. – wcamarao

3

Trong Backbone bất cứ khi nào bạn gọi đặt trên mô hình, Nó theo dõi những gì thuộc tính của mô hình đã được thay đổi và những gì thuộc tính mới được added.Calling validate cho phép nó có nhiều hiệu quả trong việc thực hiện nó. Thu thập {im lặng: true} vì các tùy chọn trong hàm cài đặt làm cho xác nhận hợp lệ và thay đổi thành không thực thi vì vậy nếu không kích hoạt bất kỳ sự kiện thay đổi nào.

If you want to set attributes as the user interacts with the UI, but the model is not valid yet

Trong trường hợp này bạn có thể thiết lập các thay đổi trong một đối tượng đơn giản chắc chắn rằng các phím đối tượng là sames như thuộc tính của mô hình và sau đó tại một thời điểm nào chỉ cần đặt trong mô hình của bạn.

var uiChanges = {name:'x'}; //just fill it with your changes 
ur_model.set(uiModel); //then set it ,this way it fires change events only once 

Để kiểm tra diff giữa đối tượng và mô hình đơn giản của bạn, bạn có thể sử dụng ur_model.changedAttributes(uiChanges);

changedAttributes - Return một đối tượng chứa tất cả các thuộc tính đã thay đổi, hay sai nếu không có thuộc tính đã thay đổi.

Bạn có thể sử dụng thêm nó chỉ lưu những thuộc tính đã thay đổi thay vì lưu toàn bộ mô hình một lần nữa.

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