我的问题与emberjs 的问题#1183和#1268有关.
我在路线上有动态元素.如果我通过应用程序导航,一切都会好的.问题是当我重新加载页面或键入url时.在这种情况下,应用程序输入deserialize函数并按其id加载和对象,但此加载是异步的.
问题#1268 lukemelia说"你需要使你的反序列化方法的结果实现承诺模式".
我尝试但总是松散上下文.我的代码类似于:
page: Ember.Route.extend
route: '/:alias'
deserialize: (router, params) -> page=App.Page.find(params.alias)
$.when( page.get("isLoaded") ).done( () -> console.debug(page.get("alias")) return page)
loading: Em.State.extend
Run Code Online (Sandbox Code Playgroud)
路由器进入加载状态,但之后返回没有上下文数据.我想我做错了什么.可能一切都是错的.
有谁能够帮我?有例子吗?
谢谢!
解决:
page: Ember.Route.extend
route: '/:id'
deserialize: (router, params) ->
page=App.Page.find(params.id})
deferred = $.Deferred()
page.addObserver("isLoaded", -> deferred.resolve(page))
return deferred.promise()
serialize: (router, page) ->
return {id: page.get("id") }
connectOutlets: (router, page) ->
router.get('applicationController').connectOutlet
context: page
name: "page"
loading: Em.State.extend
connectOutlets: (router, context) ->
router.get('applicationController').connectOutlet(context: context, name: "loading")
Run Code Online (Sandbox Code Playgroud)
页面加载时加载活动状态,页面加载完成后,路由器自动加载页面状态.
我希望这可能对某人有所帮助
@ leroj7你已经找到了一个可行的解决方案.谢谢你的分享.我创建了一个mixin,我添加到模型中,我需要有这种行为:
Editor.ModelPromise = {
init: function() {
this._super();
this._deferred = $.Deferred();
this._deferred.promise(this);
this.one('didLoad', this, '_resolveModelPromise');
this.one('becameError', this, '_rejectModelPromise');
},
_resolveModelPromise: function() {
this._deferred.resolve(this);
},
_rejectModelPromise: function() {
this._deferred.reject(this);
}
};
Run Code Online (Sandbox Code Playgroud)
也可以访问https://gist.github.com/1b54f0956ba10195a3bc
像这样的方法最终将被融入到ember-data中,尽管它很可能不具有jQuery依赖性,因为ember-data目前不依赖于jQuery.
| 归档时间: |
|
| 查看次数: |
2615 次 |
| 最近记录: |