2013-02-11 25 views
7

[Bu yeni 1.0.0-pre.4 + yönlendirici ile ilgilidir.]Kor yönlendirici: Asenkron modeli (söz?)

Bir Kor rota'nın model metoda asenkron geri aramalar ihtiyacı olan bir kayıt dönmek istiyorum Örneğin, birden fazla (iç içe) model yüklememiz gerektiğinden. Bunu yapmanın en iyi yolu nedir?

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

Bildiğim kadarıyla kod istirahat bunu bir göz atabilirsiniz zaman uyumsuzluğu getirilecek başka bir söz verir. –

+0

Keşke yapsaydı, ama sadece güncellenmeyen boş bir diziyi döndürür - AppBlog.find (1) .get ('makaleler') 'yeniden çalıştırıldığında bile boş olmayan bir dizi verir. –

+0

Bu benim için bir github sorunu gibi daha fazla hissediyor :) –

cevap

4

Ben yeni kor sürümüne Travis CI yeniden ortasındayım ve ben aynı sorunla karşı karşıya - biz kurşunla depoları getirme (Örneğin. Birincil anahtar olmayan emberjs/ember.js). Benim çözümüm Ember.ProxyObject kullanıyor.

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

ve böylece sülük emberjs/ember.js eşit olacaktır: gibi

birisi /emberjs/ember.js gibi yola girer

, parametreler bakacağız.

vekil = Ember.ObjectProxy: Sonra

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

ben içerik olarak bu nesne ile bir proxy oluşturmak: Böyle bir bilgiyle

, sadece slug ve isLoaded özelliklerini tutan basit Kor nesnesi oluşturmak .create (içerik: içerik)

Şimdi slug kullanarak sunucudan kaydı yükleyebilir ve proxy'yi model olarak iade edebilirim. Sunucudan kayıt aldığımda, proxy içeriğini gerçek kayda ayarladım.

Tam çözüm buradadır: Ben sadece `blog.get (mülkiyet) dönerseniz bildiği gibi

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 

Ayrıca` on github

0

Eğer modelin isLoaded statüsüyle ilgili, modelin kendisinde bir gözlemci ekleyin ve sonra blog.get(property) arasam nasıl İşte


sorunu göstermektedir varsayımsal bir blog uygulamasından örnek kod

blogReady: function() { 
    if(this.get('isLoaded') { 
    // switch logic 
    } 
}.observes('isLoaded')