Ember路由器:异步模式(承诺?)
[这是关于新的1.0.0-pre.4 +路由器。]
  我想从Ember Route的model方法返回需要异步回调加载的记录,例如因为它需要我们加载多个(嵌套)模型。  什么是最好的方法来做到这一点? 
以下是来自假设博客应用程序的示例代码,它说明了问题:
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)
  我正在重写Travis CI到最新的内核版本,我面临同样的问题 - 我们通过不是主键的slug(例如emberjs/ember.js )来获取存储库。  我的解决方案涉及使用Ember.ProxyObject 。 
  当有人像/emberjs/ember.js一样输入路径时,参数将如下所示: 
{ owner: 'emberjs', name: 'ember.js` }
  因此slug将等于emberjs/ember.js 。 
  有了这些信息,我创建了一个简单的Ember对象,它只是保持slug和isLoaded属性: 
content = Ember.Object.create slug: slug, isLoaded: false
然后我用这个对象创建一个代理作为内容:
proxy = Ember.ObjectProxy.create(content:content)
现在我可以使用slug从服务器加载记录并返回代理作为模型。 当我从服务器获取记录时,我只需将代理内容设置为实际记录。
完整的解决方案如下:
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
你也可以看看github上的其他代码
如何在模型本身中添加观察者,在模型的isLoaded状态上,然后调用blog.get(property) 
blogReady: function() {
  if(this.get('isLoaded') {
     // switch logic
  }
}.observes('isLoaded')
                        链接地址: http://www.djcxy.com/p/69147.html
                        上一篇: Ember router: Asynchronous model (promises?)
下一篇: while deleting record, transition to another route fails
