2013-02-11 30 views
7

[Đây là về mới 1.0.0-pre.4 + router.]Ember router: mô hình không đồng bộ (lời hứa?)

Tôi muốn trở về từ phương pháp model một Ember Route của một kỷ lục mà cần callbacks không đồng bộ để tải, ví dụ vì nó đòi hỏi chúng ta tải nhiều mô hình (lồng nhau). Cách tốt nhất để làm điều này là gì?


Đây là mẫu mã từ một ứng dụng blog giả để minh họa các vấn đề:

App.Router.map -> 
    @resource 'filteredArticles', path: '/:filter' 

App.FilteredArticlesRoute = Ember.Route.extend 
    model: (params) -> 
    blog = App.Blog.find(1) # get the user's Blog singleton 
    property = switch params.filter 
     when 'published' then 'publishedArticles' 
     when 'draft' then 'drafts' 
     when 'all' then 'articles' 
    # Return the list of articles from the `blog` record. 
    # But `blog` hasn't necessarily finished loading :(
    blog.get(property) 
+0

Theo như tôi biết nếu bạn chỉ trả lại 'blog.get (bất động sản) 'nó sẽ trả lại một lời hứa khác, điều này sẽ được lấy không đồng bộ. –

+0

Tôi ước nó đã làm, nhưng nó chỉ trả về một mảng trống không bao giờ được cập nhật - ngay cả khi chạy lại 'App.Blog.find (1) .get ('articles')' tạo ra một mảng không trống. –

+0

Điều đó cảm thấy giống như một vấn đề github với tôi :) –

Trả lời

4

Tôi đang viết lại Travis CI lên phiên bản ember mới nhất và tôi gặp vấn đề tương tự - chúng tôi tìm nạp kho bằng sên (ví dụ. emberjs/ember.js), không phải là khóa chính. Giải pháp của tôi liên quan đến việc sử dụng Ember.ProxyObject.

Khi ai đó đi vào con đường như /emberjs/ember.js, các params sẽ trông giống như:

{ owner: 'emberjs', name: 'ember.js` } 

và do đó sên sẽ bằng emberjs/ember.js.

Với những thông tin như vậy, tôi có thể tạo đối tượng Ember đơn giản, mà chỉ giữ slugisLoaded tính:

content = Ember.Object.create slug: slug, isLoaded: false 

Sau đó, tôi tạo ra một proxy với đối tượng này như nội dung:

Proxy = Ember.ObjectProxy .create (nội dung: nội dung)

Bây giờ tôi có thể tải bản ghi từ máy chủ bằng cách sử dụng sên và trả về proxy làm mô hình. Khi tôi nhận được bản ghi từ máy chủ, tôi chỉ cần đặt nội dung proxy thành bản ghi thực tế.

giải pháp đầy đủ ở đây:

deserialize: (params) -> 
    slug = "#{params.owner}/#{params.name}" 
    content = Ember.Object.create slug: slug, isLoaded: false 
    proxy = Ember.ObjectProxy.create(content: content) 

    repos = Travis.Repo.bySlug(slug) 

    observer = -> 
    if repos.get 'isLoaded' 
     repos.removeObserver 'isLoaded', observer 
     proxy.set 'content', repos.objectAt(0) 

    if repos.length 
    proxy.set('content', repos[0]) 
    else 
    repos.addObserver 'isLoaded', observer 

    proxy 

Bạn cũng có thể có một cái nhìn vào phần còn lại của mã on github

0

Làm thế nào về bạn thêm một người quan sát trong mô hình riêng của mình, về tình trạng isLoaded của mô hình và sau đó gọi blog.get(property)

blogReady: function() { 
    if(this.get('isLoaded') { 
    // switch logic 
    } 
}.observes('isLoaded') 
Các vấn đề liên quan