2013-02-11 21 views
7

[Questo è circa il nuovo 1.0.0-pre.4 + router.]Ember: asincrono di modello (promesse?)

voglio tornare da un metodo di un percorso Ember model un record che ha bisogno di callback asincroni a caricare, ad esempio perché richiede il caricamento di più modelli (nidificati). Qual'è il miglior modo per farlo?


Ecco il codice di esempio da un ipotetico blog app che illustra il problema:

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

Per quanto ne so se hai appena torna 'blog.get (proprietà)' esso restituirà un'altra promessa, che verrà recuperata asincrona. –

+0

Mi piacerebbe averlo fatto, ma restituisce solo un array vuoto che non viene mai aggiornato - anche quando esegue nuovamente 'App.Blog.find (1) .get ('articles')' produce un array non vuoto. –

+0

Mi sembra più un problema di github per me :) –

risposta

4

sono nel bel mezzo di riscrivere Travis CI alla versione più recente brace e ho affrontato lo stesso problema - abbiamo recuperare i repository di lumaca (per esempio. emberjs/ember.js), che non è la chiave primaria. La mia soluzione prevede l'utilizzo di Ember.ProxyObject.

Quando qualcuno entra il percorso come /emberjs/ember.js, i params sarà simile:

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

e quindi lumaca sarà uguale emberjs/ember.js.

Con tali informazioni, che crea semplice oggetto Ember, che continua a slug e isLoaded proprietà:

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

Poi creare un proxy con questo oggetto come il contenuto:

delega = Ember.ObjectProxy .create (contenuto: contenuto)

Ora posso caricare il record dal server utilizzando slug e restituire il proxy come modello. Quando ottengo il record dal server, ho semplicemente impostato il contenuto dei proxy sul record attuale.

soluzione completa è qui:

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 

Si può anche prendere uno sguardo al resto del codice on github

0

ne dite di si aggiunge un osservatore nel modello stesso, sullo stato IsLoaded del modello e quindi chiamare blog.get(property)

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