gpt4 book ai didi

ember.js - Ember 路由器 : Asynchronous model (promises? )

转载 作者:行者123 更新时间:2023-12-04 12:34:03 25 4
gpt4 key购买 nike

[这是关于新的 1.0.0-pre.4+ 路由器。]

我想从 Ember Route 返回 model method 需要异步回调来加载的记录,例如因为它需要我们加载多个(嵌套)模型。做到这一点的最佳方法是什么?

以下是一个假设的博客应用程序的示例代码,用于说明问题:

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到最新的 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

关于ember.js - Ember 路由器 : Asynchronous model (promises? ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com