我有两个模型叫做'Scenario'和'Event',它们是通过RESTAdapter加载的。
在"场景"中。我只需要场景,但在"场景"路由中,我需要一个所有事件的列表,以便我可以呈现一个表单将它们与所显示的场景关联起来。
使用下面的代码,如果我直接访问'scenario'路由,但如果我首先访问'scenario'路由,则不起作用。索引'路由,然后是'场景'路由。
我的意思是,ScenarioRoute.model()不会被调用,如果我先去到scenario indexroute .
App.Router.map(function()
{
this.resource('scenarios', function()
{
this.resource('scenario', {path: '/:id'});
});
});
App.ScenariosIndexRoute = Ember.Route.extend({
model: function()
{
return this.store.find('scenario');
}
});
App.ScenarioRoute = Ember.Route.extend({
model: function(params)
{
return {
scenario: this.store.find('scenario', params.id),
events: this.store.find('event')
};
}
});
我该怎么做?
在你的情况下,我认为实现这一点的最简单的方法是为事件创建另一个路由和控制器,并将场景控制器与该事件控制器的需求联系起来。
我认为这主要是因为"最好"的方法是使用依赖注入,但这并不简单。
如果你觉得自己很勇敢,不妨去看看:http://discuss.emberjs.com/t/some-improvement-ideas-for-our-di-subsystem/2378
但正如论坛上讨论的那样,这对你有用吗?(对他人的启发):
App.PostRoute = Ember.Route.extend({
afterModel: function(transition) {
var self = this;
var postsController = this.controllerFor('posts');
if(Ember.isEmpty(postsController.get('allEvents'))) {
// find returns a promise. We attach a "then" "callback" to it
// so that "callback" will execute after the store's find promise has resolved
self.store.find('event').then(function(events) {
postsController.set('allEvents', events)
});
}
}
});
我是这样处理这个特殊用例的:
App.ScenarioRoute = Ember.Route.extend({
model: function(params) {
var scenario = this.store.find('scenario', params.id);
scenario.then(function(scenario) {
scenario.get('events)
});
return scenario;
}
});
也就是说,你是一个与另一个promise相连的promise: store。Find返回一个promise,然后我们使用"then"调用在获得promise后从场景中获取事件。