2013-10-29 32 views
5

chi tiết: ember-data-1.0.0.beta.3 và RESTAdapter mặc địnhember dữ liệu - store.find ('model') thường yêu cầu máy chủ

tôi có thể đã hiểu lầm như thế nào phương pháp store.find() hoạt động, nhưng, từ hiểu biết của tôi, đoạn code sau không nên truy vấn máy chủ nếu các hồ sơ tôi yêu cầu cho là đã có mặt tại các cửa hàng:

var IndexRoute = Em.Route.extend({ 
    model: function() { 
     return this.store.find('link'); 
    }, 
}); 

từ các tài liệu emberjs.com cho DS.Store.find():

Phương pháp tìm sẽ luôn trả về lời hứa sẽ được giải quyết bằng hồ sơ. Nếu hồ sơ đã có trong cửa hàng, lời hứa sẽ được giải quyết ngay lập tức. Nếu không, cửa hàng sẽ yêu cầu phương pháp tìm của bộ điều hợp để tìm dữ liệu cần thiết.

Tôi có một tuyến đường khác có móc chính xác giống nhau, nhưng khi tôi truy cập tuyến đó và mặc dù dữ liệu đã có trong cửa hàng, máy chủ sẽ được truy vấn. Và nếu tôi quay lại con đường Index, nó sẽ được truy vấn lại. Không nên .find() xử lý việc này?

+0

Bạn có plugin Ember dành cho Chrome không? Bạn có thể kiểm tra xem dữ liệu có trong cửa hàng Ember không. – claptimes

Trả lời

17

Phương pháp tìm sẽ luôn trả về lời hứa sẽ được giải quyết cùng với bản ghi. Nếu hồ sơ đã có trong cửa hàng, lời hứa sẽ được giải quyết ngay lập tức. Nếu không, cửa hàng sẽ yêu cầu phương thức tìm của bộ chuyển đổi để tìm dữ liệu cần thiết.

Chỉ hoạt động khi tìm kiếm theo id this.store.find('link', 1). Sử dụng this.store.find('link') sẽ luôn thực hiện các yêu cầu trong máy chủ.

Bạn có thể lấy dữ liệu cục bộ bằng cách sử dụng phương thức allthis.store.all('link'). Nhưng ở một số nơi trong ứng dụng của bạn, bạn sẽ cần tải trước dữ liệu đó bằng phương thức find. Nếu không, all sẽ không trả lại gì.

Bạn có thể sử dụng sau đây để có được những hành vi mong muốn:

App.ApplicationRoute = Ember.Route.extend({ 
    model: function() { 
     // preload all data from the server once 
     this.store.find('person'); 
    } 
}); 

App.LinksRoute = Ember.Route.extend({ 
    model: function() {  
     // get the local data without request the server 
     return this.store.all('person'); 
    } 
}); 

App.OtherRoute = Ember.Route.extend({ 
    model: function() { 
     // get the local data without request the server 
     return this.store.all('person'); 
    } 
}); 

tôi đã thực hiện một fiddle với điều này xin vui lòng cho một cái nhìn http://jsfiddle.net/marciojunior/Az2Uc/

fiddle Đó sử dụng mockjax jquery, nếu bạn thấy trình duyệt giao diện điều khiển các MOCK GET: /people được hiển thị chỉ một lần, điều này giống như một yêu cầu xhr thông thường, nhưng nó được chế giễu. Chuyển đổi sang people1people2 sẽ không thực hiện các yêu cầu khác chỉ nhận dữ liệu cục bộ.

+0

Cảm ơn bạn đã làm rõ. Tôi có một câu hỏi liên quan. Có thể bạn biết câu trả lời: Tôi có mô hình danh mục và tôi tải danh sách các danh mục trong ApplicationRoute. Tôi cũng có một CategoryRoute, nhưng ở đó tôi có một vấn đề khác. 'this.store.find ('category', params.category_id)' sẽ truy vấn máy chủ, nhưng nó sẽ sử dụng hành động chỉ mục, thay vì hành động hiển thị. Tuy nhiên, nếu tôi không tải các loại trong ApplicationRoute, nó hoạt động như mong đợi. –

+0

Xin lỗi, tôi không hiểu vấn đề của bạn. Tôi khuyên bạn nên tạo một câu hỏi khác để những người khác có thể giúp bạn. –

+1

Xin chào, cảm ơn vì đã dành thời gian cho bạn. Tôi đã thêm một câu hỏi chi tiết hơn tại đây: http://stackoverflow.com/questions/19680014/ember-data-store-findmodel-id-force-request-to-server.Nếu bạn có thể, xin hãy xem. –

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