Ember.js 异步路由
我的问题与emberjs的问题有关 我在路线上有动态元素。如果我通过应用程序导航,一切都可以。问题是当我重新加载页面或键入url时。在这种情况下,应用程序输入反序列化函数,并按id加载和对象,但此加载是异步的 在这个问题上,lukemelia说“您需要使反序列化方法的结果实现promises模式” 我试过了,但总是脱离上下文。我的代码类似于:Ember.js 异步路由,ember.js,Ember.js,我的问题与emberjs的问题有关 我在路线上有动态元素。如果我通过应用程序导航,一切都可以。问题是当我重新加载页面或键入url时。在这种情况下,应用程序输入反序列化函数,并按id加载和对象,但此加载是异步的 在这个问题上,lukemelia说“您需要使反序列化方法的结果实现promises模式” 我试过了,但总是脱离上下文。我的代码类似于: page: Ember.Route.extend route: '/:alias' deserialize: (router, params) ->
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
路由器进入加载状态,但返回时没有上下文数据。我想我做错了什么。可能一切都错了
有人能帮我吗?有什么例子吗
谢谢
已解决:
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")
当页面加载时,活动状态为加载,当页面加载完成时,路由器自动加载页面状态
我希望这能帮助别人你找到了一个可行的解决方案。谢谢分享。我已经创建了一个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);
}
};
亦可于
像这样的方法最终将被烘焙到ember数据中,尽管它很可能不依赖于jQuery,因为ember数据目前并不依赖于jQuery。使用didLoad的观察者不起作用,至少在关系改善分支上是这样。我试过了,但似乎记录还没有以加载状态传递,因此修改它会引发类似“cannot send event setProperty is state rootState.loading”的异常。你遇到过这个吗?@sly7_7我没见过这个。我们正在使用我在生产中与关系改善部门共享的代码,它对我们来说运行良好。嗯,好吧。。。也许我做错了什么。。。但是读取代码时,didLoad是在模型进入加载状态之前触发的,因此我认为应该发生我遇到的行为。这个评论也应该是一个线索。@sly7_7你是对的,在你的小提琴中,didLoad在你开始听之前就已经开火了。这就是为什么我共享的mixin是一个更好的解决方案。它不会受到这个问题的影响。好吧,我可以理解,但即使在构造函数中定义didLoad,我也会遇到同样的问题:因此jQuery.Deferred可能正在做一些特殊的事情,否则,事实是当触发didLoad时,模型没有处于其加载状态,因此修改它会抛出此错误。对不起,我一直坚持,但我只是想确定我看到了什么。