【问题标题】:Emberjs async routingEmberjs 异步路由
【发布时间】:2012-08-15 14:08:40
【问题描述】:

我的问题与emberjs的#1183#1268问题有关。

我在路线上有动态元素。如果我通过应用程序导航,一切都很好。问题是当我重新加载页面或键入 url 时。在这种情况下,应用程序进入反序列化函数并通过其 id 加载和对象,但此加载是异步的。

在问题#1268lukemelia 说“你需要让你的反序列化方法的结果实现承诺模式”

我尝试过,但总是松散的上下文。我的代码类似于:

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

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

我希望这可以帮助某人

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    @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。

    【讨论】:

    • 观察者放在didLoad 上不起作用,至少在关系改进分支上是这样。我试过了,但是好像在加载状态下记录还没有传进去,所以修改它会抛出类似“无法发送事件setProperty是状态rootState.loading”的异常。你遇到过吗?
    • @sly7_7 我还没有看到这个。我们正在使用我在生产中与关系改进分支共享的代码,它对我们来说工作正常。
    • 嗯,好吧......也许我做错了什么......但是阅读代码github.com/emberjs/data/blob/relationship-improvements/packages/…在模型进入加载状态之前触发了didLoad,所以我遇到的行为应该发生.这条评论github.com/emberjs/ember.js/pull/1406#issuecomment-8888168也应该是一个线索。
    • @sly7_7 你是对的,在你的小提琴中,didLoad 在你开始收听它之前已经被解雇了。这就是为什么我分享的 mixin 是一个更好的解决方案。它不会受到这个问题的影响。
    • 好的,我可以理解,但是即使通过在构造函数中定义 didLoad,我也会遇到同样的问题:jsfiddle.net/Sly7/2VpRh/11 所以也许 jQuery.Deferred 正在做一些特别的事情,否则,事实是当didLoad 被触发,模型没有处于加载状态,所以修改它会抛出这个错误。抱歉,我一直坚持,但我只是想确定我所看到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2014-11-07
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多