2011-07-13 53 views
11

Làm cách nào để bạn quay lại các thay đổi mô hình khi gặp phải lỗi phía máy chủ (ví dụ: lỗi xác thực)?Xác thực phía máy chủ Backbone.js và các lỗi phía máy chủ khác

Do xác thực nhất định phải được thực hiện ở phía máy chủ, cách thích hợp để làm điều này với backbone.js (Rails backend) là gì?

Khi lưu mô hình đường trục, xác thực phía máy khách sẽ kích hoạt cung cấp trải nghiệm người dùng thích hợp nếu xác thực không thành công (số lượt xem của mô hình đó không cập nhật). Tuy nhiên, nếu xác nhận hợp lệ phía máy chủ không thành công, mô hình và tất cả các khung nhìn của nó đã được cập nhật (với dữ liệu không hợp lệ) trước PUT tới máy chủ.

Dường như có một vài vấn đề với điều này.

  1. Tất cả các chế độ xem được cập nhật trước khi mô hình được xác thực phía máy chủ. Ví dụ: Nếu bạn có danh sách các mô hình có hộp thoại chỉnh sửa bật lên , mô hình trong danh sách được cập nhật có khả năng thông tin không hợp lệ sau khi bạn gọi Model.save, nhưng trước khi có được xác thực phía máy chủ PUT'ed.
  2. Nếu máy chủ trả về lỗi (ví dụ: lỗi 422), không có 'rollback' của mô hình xảy ra. Dữ liệu không định giá chỉ là ngồi ở đó giống như một đàn cỏ. Đây thực sự là cái xấu.

Tôi có sử dụng backbone.js sai không? Có cách nào nổi tiếng để xử lý kịch bản (rất phổ biến) này không? Tôi hiểu tôi có thể làm một số bộ nhớ đệm thủ công của các giá trị cũ, vv, nhưng nó là loại một giải pháp có mùi.

Cảm ơn!

+0

Điều này dường như được trả lời ở đây: http://stackoverflow.com/a/10335668/1284283 (một năm sau và có thể là phiên bản mới hơn của backbonej). – brightgarden

Trả lời

5

Không biết nếu tôi làm điều này sai (mới để BackboneJS), nhưng tôi đã có cùng một vấn đề và đây là cách tôi giải quyết nó:

  • Tôi làm tất cả của tôi kiểm chứng thực server-side

  • Thay vì thực hiện một mô hình bình thường, tôi thực hiện cuộc gọi ajax tiêu chuẩn đến máy chủ và trả về một thông báo lỗi hoặc thông báo thành công chứa các thuộc tính của mô hình đã sửa đổi. Nếu nó là một thành công, sau đó tôi có thể làm model.set với các thuộc tính trả về để cập nhật mô hình và khung nhìn tương ứng.

  • Nếu trước tiên bạn muốn xác thực phía máy khách, tôi đoán bạn có thể thực hiện lưu với tùy chọn {silent: true}, để chế độ xem không được cập nhật, sau đó thực hiện cuộc gọi ajax và xem những gì cần được thực hiện theo phản hồi (khôi phục các giá trị ban đầu cho mô hình nếu lỗi hoặc cập nhật lượt xem nếu thành công)

Hy vọng điều này sẽ hữu ích.

ps: công trình này, nhưng không cảm thấy "sạch". Nếu có giải pháp tốt hơn, tôi cũng rất thích đọc nó

+0

Tôi không biết về thông số {silent: true}. Điều đó có thể giúp giữ cho các lượt xem được cập nhật trong khi ở trạng thái trung gian. Tôi đồng ý, phần còn lại không cảm thấy 'sạch': P Xin lỗi, tôi không thể 'bỏ phiếu'; Tôi chưa có đủ danh tiếng. – John

0

Điều tôi sẽ làm ở phía máy chủ đảm bảo bạn gặp bất kỳ lỗi nào và trước khi trả về truy vấn phản hồi cho bản ghi gốc từ DB và trả về JSON cùng với phản hồi lỗi. Sau đó, bạn chỉ có thể thực hiện việc này:

model.save({}, { 
    error: function(model, response){ 
    model.set(response); 
    } 
}); 

Giả sử xem của bạn sau đó sẽ xem các sự kiện thay đổi trên mô hình, chúng sẽ cập nhật tương ứng.

+0

Điều này là tốt cho một phân lớp nào đó của lỗi (tôi bắt đầu đi xuống đường dẫn này), nhưng đối với một số lỗi nhất định trả về đại diện của đối tượng có thể không khả thi hoặc không phù hợp (ví dụ: lỗi vận chuyển hoặc 'truy cập bị từ chối' hoặc 'chưa đăng nhập trong 'loại sự vật'. Có thể kết thúc làm điều này cho một số lỗi mặc dù; nó chắc chắn sẽ giúp xác nhận phía máy chủ bình thường. – John

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