【问题标题】:Ember router: Asynchronous model (promises?)Ember 路由器:异步模型(承诺?)
【发布时间】:2013-01-26 16:27:49
【问题描述】:

[这是关于新的 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)

【问题讨论】:

  • 据我所知,如果您只返回blog.get(property),它将返回另一个承诺,该承诺将被异步获取。
  • 我希望这样做,但它只是返回一个永远不会更新的空数组——即使重新运行 App.Blog.find(1).get('articles') 会产生一个非空数组。
  • 这对我来说更像是一个 github 问题 :)
  • 我也遇到过类似的问题(但在控制器中操作内容时),并求助于isLoaded (gist.github.com/domchristie/4774472):一种受Discourse source code 启发的模式。你能体验this issue吗?
  • 感谢 Dom - 您链接的代码并不能解决路由器希望您立即返回某些内容的问题,但问题讨论 (#1642) 看起来很有趣。

标签: ember.js ember-router


【解决方案1】:

我正在将 Travis CI 重写为最新的 ember 版本,我遇到了同样的问题 - 我们通过 slug(例如 emberjs/ember.js)获取存储库,这不是主键。我的解决方案涉及使用Ember.ProxyObject

当有人进入/emberjs/ember.js这样的路径时,参数将如下所示:

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

因此 slug 将等于 emberjs/ember.js

有了这些信息,我创建了简单的 Ember 对象,它只保留了 slugisLoaded 属性:

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

你也可以看看剩下的代码on github

【讨论】:

    【解决方案2】:

    你在模型本身中添加一个观察者怎么样,在模型的isLoaded状态上然后调用blog.get(property)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2021-01-22
      • 1970-01-01
      • 2018-07-01
      • 2017-06-15
      • 1970-01-01
      相关资源
      最近更新 更多