我正在尝试在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中看到的延迟加载的所有示例都将路径放在延迟加载的文件之外。这是唯一可行的选择吗?
答案 0 :(得分:1)
自动生成ember路由是由link-to
组件通过href
计算属性引起的。永远不要反对它。灰烬不能正常工作,你会松动。但你应该深入了解它以了解机制。
href
LinkToComponent方法请求一个URL。在回答之前,Ember寻找路线。如果它不存在,Ember会从route:basic
创建一个。
Container
和Registry
有一些有用的方法:reset
和lookup
前者,register
和unregister
后者。
register
和unregister
修改注册表。
lookup
会创建不存在的实例,在factoryCache
中查找工厂,并将其存储在cache
中。如果那里不存在工厂,它会询问Registry
。
reset
清除指定成员的cache
和factoryCache
。
那就是说,为了实现延迟加载,正确的顺序应该是:
unregister(fullName);
reset(fullName);
register(fullName, factory);
lookup(fullName);
要获得初步解决方案,请查看https://github.com/ricottatosta/ember-wiz
答案 1 :(得分:0)
自动生成ember对象是由链接到组件通过href计算属性引起的。为了避免这种行为(它可能是空白页面的责任)我建议改变href以避免调用计算所谓的'意图'自动生成丢失的对象。