Jo *_*iss 7 ember.js ember-router
[这是关于新的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)
Run Code Online (Sandbox Code Playgroud)
小智 4
我正在将Travis CI重写为最新的 ember 版本,我遇到了同样的问题 - 我们通过 slug 获取存储库(例如emberjs/ember.js),这不是主键。我的解决方案涉及使用Ember.ProxyObject.
当有人输入类似 的路径时/emberjs/ember.js,参数将如下所示:
{ owner: 'emberjs', name: 'ember.js` }
Run Code Online (Sandbox Code Playgroud)
因此 slug 将等于emberjs/ember.js.
有了这些信息,我创建了简单的 Ember 对象,它只保留slug和isLoaded属性:
content = Ember.Object.create slug: slug, isLoaded: false
Run Code Online (Sandbox Code Playgroud)
然后我创建一个以此对象作为内容的代理:
代理= Ember.ObjectProxy.create(内容:内容)
现在我可以使用 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
Run Code Online (Sandbox Code Playgroud)
您还可以查看github 上的其余代码
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |