Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ember.js 异步路由_Ember.js - Fatal编程技术网

Ember.js 异步路由

Ember.js 异步路由,ember.js,Ember.js,我的问题与emberjs的问题有关 我在路线上有动态元素。如果我通过应用程序导航,一切都可以。问题是当我重新加载页面或键入url时。在这种情况下,应用程序输入反序列化函数,并按id加载和对象,但此加载是异步的 在这个问题上,lukemelia说“您需要使反序列化方法的结果实现promises模式” 我试过了,但总是脱离上下文。我的代码类似于: page: Ember.Route.extend route: '/:alias' deserialize: (router, params) ->

我的问题与emberjs的问题有关

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

在这个问题上,lukemelia说“您需要使反序列化方法的结果实现promises模式”

我试过了,但总是脱离上下文。我的代码类似于:

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时,模型没有处于其加载状态,因此修改它会抛出此错误。对不起,我一直坚持,但我只是想确定我看到了什么。