2012-10-31 25 views
6

ĐẦ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 requestCompleterequestException. 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, messagedata.

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 successfalse, 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:

  1. Thứ nhất, loại bỏ các bản ghi từ các cửa hàng qua store.remove()
  2. Gọi store.sync() như tôi có autoSync bộ cửa hàng để false.
  3. Đ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.
  4. Đâ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.
  5. 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.

+1

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

+0

@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! –

Trả lời

2

Tôi nghĩ bạn đã tranh luận hùng hồn về vị trí của mình. Tôi không thấy bất cứ điều gì sai với vị trí bạn đã thực hiện. Sự sỉ nhục duy nhất của tôi là chỉ ra rằng thiết lập tự động đồng bộ trên một cửa hàng có thể chỉnh sửa lưới điện là một cách tiết kiệm hơn rất nhiều so với việc hoàn thành nhiệm vụ, mặc dù ít kiểm soát hơn.

Để thêm, chi phí mà bạn chỉ ra thường là do trường hợp không mong muốn hoặc tôi sẽ gọi các cạnh có thể cần xử lý đặc biệt hoặc làm mới thêm dữ liệu. Bạn có thể thêm người nghe cho những trường hợp cụ thể đó và để phần còn lại hoạt động với các giá trị mặc định.

+0

Cảm ơn bạn đã nhập. Tôi sẽ thừa nhận rằng tôi đã không nhìn nhiều vào kích thước gói thực tế và lưu lượng mạng tổng thể mà kết quả từ đồng bộ vs lưu mà tôi đã có nghĩa là để có được xung quanh trong một thời gian. Tôi thích cách tiếp cận của bạn để xử lý các giao dịch kỳ quặc bằng cách bắn một sự kiện - Tôi sẽ phải tinker về cách tiếp cận này và xem nó cảm thấy như thế nào. 1 cho nhận xét sâu sắc –

+0

không nên có bất kỳ sự khác biệt nào giữa đồng bộ hóa và lưu khi cả hai đều sử dụng cùng một proxy (có khả năng) để nói chuyện với máy chủ. – dbrin

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