我有两个名为'Scenario'和'Event'的模型,它们是通过RESTAdapter加载的。
在'scenario.index'路线上我只需要场景,但在'场景'路线上我需要一个所有事件的列表,所以我可以提供一个表格将它们与显示的场景相关联。
使用下面的代码,如果我直接访问“方案”路线,这是有效的,但如果我首先访问'scenario.index'路线然后访问'方案'路线则不行。
我的意思是如果我第一次去ScenariosIndexRoute就不会调用ScenarioRoute.model()。
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')
};
}
});
我该怎么做?
答案 0 :(得分:2)
在您的情况下,我认为实现此目的的最简单方法是为事件创建另一个路由和控制器,并根据事件控制器的需要挂起场景控制器。
我认为这是因为“最好”的方法是使用依赖注入,但这并不是很简单。
如果你有勇气,请随时阅读: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)
});
}
}
});
答案 1 :(得分:0)
这是我解决这个特定用例的方法:
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;
}
});
也就是说,你是另一个链接的承诺:store.find返回一个promise,然后我们使用“then”调用来获取场景中的事件。