Ember.js中的延迟加载路由定义

时间:2014-12-21 05:06:19

标签: ember.js

我正在尝试在Ember.js应用程序中实现延迟加载。理想情况下,我更喜欢将每个模块的所有相关代码(包括任何控制器和路由定义)放在一个延迟加载的单独.js文件中。

现在,当我转换到路由时,js文件被正确加载,但由于Ember隐式生成路由定义,因此使用隐式生成的路由对象而不是我的延迟加载的js文件中的路由。

在我的延迟加载的js文件中,我有一条应该链接到App.UsersManagerRoute路由的路由users.manager。在Ember Inspector中,我可以看到,即使在我加载了js文件之后,也会使用隐式生成的路径。

为了解决这个问题,我尝试在加载js文件后手动注册路由,但它似乎没有工作。这是我执行延迟加载的代码:

Ember.Router.reopen({
  _doTransition: function (_targetRouteName, models, _queryParams) {
    var resourceName = _targetRouteName.split('.')[0];
    var self = this;
    var transition = self._super(_targetRouteName, models, _queryParams);
    transition.abort();
    var fullRouteName = 'route:' + camelizeRouteName(_targetRouteName);
    self.container.unregister(fullRouteName);
    App.lazyLoad(resourceName, function() {
      self.container.register(fullRouteName, App[sentenceCasedRouteName(_targetRouteName) + 'Route']);
      transition.retry();
    });
    return transition;
  }
});

在我取消注册隐式生成的路由并注册我的延迟加载路由后,路由定义似乎正确使用,但由于某种原因,我看到一个空白页而不是正确的模板。我不太清楚我在这里缺少什么,或者我正在尝试做的是推荐的方法。

到目前为止我在Ember中看到的延迟加载的所有示例都将路径放在延迟加载的文件之外。这是唯一可行的选择吗?

2 个答案:

答案 0 :(得分:1)

自动生成ember路由是由link-to组件通过href计算属性引起的。永远不要反对它。灰烬不能正常工作,你会松动。但你应该深入了解它以了解机制。

href LinkToComponent方法请求一个URL。在回答之前,Ember寻找路线。如果它不存在,Ember会从route:basic创建一个。

ContainerRegistry有一些有用的方法:resetlookup前者,registerunregister后者。

registerunregister修改注册表。

lookup会创建不存在的实例,在factoryCache中查找工厂,并将其存储在cache中。如果那里不存在工厂,它会询问Registry

reset清除指定成员的cachefactoryCache

那就是说,为了实现延迟加载,正确的顺序应该是:

unregister(fullName);
reset(fullName);
register(fullName, factory);
lookup(fullName);

要获得初步解决方案,请查看https://github.com/ricottatosta/ember-wiz

答案 1 :(得分:0)

自动生成ember对象是由链接到组件通过href计算属性引起的。为了避免这种行为(它可能是空白页面的责任)我建议改变href以避免调用计算所谓的'意图'自动生成丢失的对象。