Emberjs异步路由

时间:2012-08-20 08:23:39

标签: ember.js

我的问题与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

路由器进入加载状态,但随后返回时没有上下文数据。我想我做错了什么。可能一切都是错的。

任何人都可以帮助我吗?是否有例子?

谢谢!

解决:

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")

页面加载时正在加载活动状态,页面加载完成后,路由器自动加载页面状态。

我希望这可以帮助某人

1 个答案:

答案 0 :(得分:5)

@ 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);
  }
};

也可在https://gist.github.com/1b54f0956ba10195a3bc

获取

这样的方法最终将被融入到ember-data中,尽管它很可能不具有jQuery依赖性,因为ember-data目前不依赖于jQuery。