2012-11-12 23 views
5

Tôi có phương thức tải cửa hàng trả về dữ liệu qua yêu cầu ajax. Tôi có thể thấy rằng dữ liệu đang được trở lại sử dụng Firebug, nhưng xử lý thành công của tôi là không nhận được gọi là:Trình xử lý thành công của bộ nạp Extjs không bị sa thải

this.getCategoriesStore().load({params:{'id':d.data.category_id}}, { 
     success: function(category) { 
      console.log("Category: " + category.get('name')); 
     }, 
     error: function(e) { 
      console.log(e); 
     } 
    }); 

Tôi trả lại một tham số thành công, cùng với các dữ liệu:

{"success":true,"categories":{"id":5,"name":"Frying","section_id":2}} 

Có một cái gì đó mất tích hay tôi đang làm gì sai?

Trả lời

20

Vâng, tôi giả sử bạn đang tìm kiếm này:

store.load({ 
    params:{'id':d.data.category_id}, 
    scope: this, 
    callback: function(records, operation, success) { 
     if (success) { 
      console.log("Category: " + category.get('name')); 
     } else { 
      console.log('error'); 
     } 
    } 
}); 

Nó không phải là rõ ràng trong API rằng params bổ sung của bạn có thể được đặt ở đó quá. Nhưng ExtJS thường sử dụng các đối tượng cấu hình để kết nối mọi thứ.

Chỉnh sửa để trả lời bình luận:

Câu trả lời ngắn gọn là:

Bây giờ phiên bản dài hơn: Trong trường hợp của cửa hàng đó là tùy thuộc vào bạn để trực tiếp cung cấp giấu tên (hoặc bê tông) gọi lại hoặc đăng ký sự kiện. Cả hai sẽ làm việc giống nhau trong tình huống của bạn ở đây.

Nhưng bạn chỉ có thể có một cuộc gọi lại trong khi bạn có thể có nhiều sự kiện. Trong các tình huống khác, bạn sẽ tìm thấy các tình huống trong đó các sự kiện phù hợp hơn nhiều hoặc nơi sự kiện là cách duy nhất. Điều đó sẽ luôn luôn là trường hợp khi bạn đang lắng nghe. Dưới đây là một số lưu ý về điều đó:

  • sử dụng thuộc tính {single: true} khi bạn chỉ cần gọi lại một lần. Ví dụ: store.on('load', function(s) { /* do something*/ }, scope, { single: true }) Trình nghe sẽ bị xóa sau khi được gọi. Đây là nguyên nhân cần thiết của việc sử dụng một hàm ẩn danh, không thể xóa được.
  • sử dụng mon() trong hầu hết các trường hợp bạn ràng buộc người nghe trực tiếp trong định nghĩa lớp để đảm bảo người nghe bị hủy cùng với phiên bản của lớp.

Cả hai sẽ giúp bạn tiết kiệm bộ nhớ trình duyệt.

+0

thông tin bổ sung hữu ích, cảm ơn. Tôi có thể hỏi nếu cách tôi tải cửa hàng là chính xác không? Tôi đang tải 3 cửa hàng trong bộ điều khiển, và phương pháp này dường như là một cửa sổ được tạo tự động. Tôi vẫn còn làm quen với cú pháp - với tôi, this.store.Categories.load() dường như rõ ràng hơn, nhưng rõ ràng là không phải vậy! – BrynJ

+0

@BrynJ Tôi sẽ cập nhật bài đăng của mình để cung cấp thêm một số thông tin về callbacks & listeners. – sra

+0

Chỉ cần nhận thấy rằng tôi đặt niềng răng không chính xác trong mã của tôi quá - Tôi đã khá chắc chắn tôi cũng đã cố gắng gọi lại như tên tài sản cho xử lý của tôi ... trong trường hợp đó hy vọng điều này sẽ làm việc :) – BrynJ

6

Hãy thử điều này:

store.load({ 
    scope: this, 
    callback: function(records, operation, success) { 
     // the operation object 
     // contains all of the details of the load operation 
     console.log(records); 
    } 
}); 

http://docs.sencha.com/ext-js/4-1/#!/api/Ext.data.Store-method-load theo các tài liệu không có thành công và lỗi gọi lại.

Một giải pháp thay thế khác để cung cấp gọi lại, bạn cũng có thể thêm trình xử lý sự kiện "tải" trên cửa hàng cho cùng một hiệu ứng.

+0

Cảm ơn bạn đã trả lời. Có thể bạn có thể cung cấp thêm một số ngữ cảnh nữa - cuộc gọi hiện tại nằm trong một chức năng điều khiển ... Tôi không chắc cách thực hiện điều này? – BrynJ

+0

giống như khối "thành công" của bạn, chỉ cần "gọi lại" thay vì :) – dbrin

+0

Ah, tôi hiểu, tôi sẽ thử lại lần nữa – BrynJ