ĐẦU TIÊN: Tôi nhận thấy câu hỏi này đã được hỏi ở đây: in ExtJS, is it better to call Model.save() or Store.Sync()? - tuy nhiên tôi muốn kiểm tra thêm, cụ thể là giảm thiểu XHR và phí không cần thiết trên cả máy khách và máy chủ. Tôi không cảm thấy một trong những điểm này được giải quyết trong câu hỏi được liên kết.ExtJS 4.1 - Store.add() (tiếp theo là đồng bộ) vs Model.save()
Tôi có một ứng dụng hơi lớn được thiết kế để quản lý tài nguyên doanh nghiệp, bao gồm nhiều mô hình, chế độ xem và bộ điều khiển. Tôi xử lý tất cả các phản hồi từ máy chủ của mình bằng cách thiết lập trình nghe cho các sự kiện Ext.Ajax requestComplete
và requestException
. Tôi đã sử dụng phương pháp này thay vì viết các trình xử lý sự kiện trùng lặp trên mỗi sự kiện proxy afterRequest
của mỗi mô hình. Điều này cho phép tôi có tất cả các bộ điều khiển back-end của tôi (sử dụng Zend Framework) đáp ứng với ba tham số: success
, message
và data
.
Sau khi yêu cầu thành công (tức là, HTTP 200), phương thức chạy cho requestComplete
sẽ kiểm tra phản hồi JSON cho các tham số nói trên. Nếu success
là false
, dự kiến sẽ có thông báo lỗi có trong message
, sau đó được hiển thị cho người dùng (ví dụ: 'Đã xảy ra sự cố khi lưu sản phẩm đó. Tên sản phẩm không hợp lệ'). Nếu thành công là đúng, hành động được thực hiện tùy thuộc vào loại yêu cầu, tức là, Tạo, Đọc, Cập nhật hoặc Hủy. Sau khi thành công create
, bản ghi mới sẽ được thêm vào kho dữ liệu thích hợp, sau khi xóa bản ghi bị hủy, v.v.
Tôi đã chọn cách tiếp cận này thay vì thêm bản ghi vào cửa hàng và gọi phương thức sync
của cửa hàng để giảm thiểu các chuyến đi khứ hồi của XHR và các chuyến đi khác. Phương tiện lưu/cập nhật dữ liệu hiện tại của tôi là gửi yêu cầu đến phần cuối và phản hồi kết quả trên giao diện người dùng Ext. Tôi làm điều này bằng cách điền một mô hình với dữ liệu và gọi model.save() để tạo/cập nhật các yêu cầu, hoặc model.destroy() để loại bỏ dữ liệu.
Tôi thấy rằng khi thêm/cập nhật/xóa bản ghi khỏi cửa hàng, sau đó gọi store.sync(), tôi sẽ phải phản ứng với phản hồi của máy chủ theo cách khiến bạn cảm thấy khó xử. Lấy ví dụ, xoá một bản ghi:
- Thứ nhất, loại bỏ các bản ghi từ các cửa hàng qua
store.remove()
- Gọi
store.sync()
như tôi cóautoSync
bộ cửa hàng đểfalse
. - Điều này kích hoạt yêu cầu hủy AJAX từ proxy mô hình của cửa hàng.
- Đây là nơi nó trở nên lạ .... nếu có lỗi trên máy chủ trong khi thả hàng từ cơ sở dữ liệu, phản hồi sẽ trả về
success: false
, tuy nhiên bản ghi sẽ bị xóa khỏi Cửa hàng dữ liệu ExtJS. - Tại thời điểm này, tôi có thể gọi
store.sync()
,store.load()
(cả hai yêu cầu chuyến đi khứ hồi) hoặc nhận hồ sơ từ yêu cầu và thêm lại vào cửa hàng theo sau làcommitChanges()
để tránh gọi thêm đồng bộ/tải và do đó tránh một chuyến khứ hồi không cần thiết.
Cũng vậy với thêm hồ sơ, nếu máy chủ bị lỗi ở đâu đó trong khi thêm dữ liệu vào cơ sở dữ liệu, hồ sơ vẫn còn trong các cửa hàng ExtJS và phải được loại bỏ bằng tay để tránh một chuyến đi vòng với store.sync()
hay store.load()
.
Để tránh toàn bộ vấn đề này, như tôi đã giải thích trước đây, tôi khởi tạo một trong các đối tượng mô hình của tôi (ví dụ:một Mô hình sản phẩm), điền dữ liệu vào đó và gọi myModel.save()
. Điều này, đến lượt nó, gọi số create
hoặc update
của proxy tùy thuộc vào ID của mô hình và kích hoạt yêu cầu AJAX thích hợp. Trong trường hợp back-end không thành công, cửa hàng front-end vẫn không thay đổi. Khi yêu cầu thành công (đọc: success: true
, không phải HTTP 200), tôi thêm bản ghi theo cách thủ công vào cửa hàng và gọi store.commitChanges(true)
, đồng bộ hóa hiệu quả cửa hàng với cơ sở dữ liệu mà không cần thêm chuyến đi vòng và tránh chi phí không cần thiết. Đối với tất cả các yêu cầu, máy chủ sẽ phản hồi với dữ liệu mới/đã sửa đổi cũng như thông số thành công và có điều kiện một thông báo hiển thị trên máy khách.
Tôi có thiếu thứ gì đó ở đây hay cách tiếp cận này là cách tốt để giảm thiểu chi phí của XHR và máy chủ/khách hàng? Tôi vui mừng cung cấp mã ví dụ nên được yêu cầu, tuy nhiên tôi cảm thấy rằng đây là một khái niệm khá chung chung với mã cơ bản.
Hãy xem này [link] [1], tôi thấy nó rất hữu ích [1]: http://stackoverflow.com/questions/11022616/store-do-something-after- sync-with-autosync-enabled – Amin
@Amin cảm ơn bạn đó là những phương pháp chắc chắn hữu ích! Tôi làm model.save() cho hầu hết các phần của ứng dụng, nhưng điều này sẽ rất hữu ích khi sử dụng built-in sync'ing store được sử dụng. Cảm ơn bạn! –