谨防:
您需要注意是否适合在模型挂钩中返回多个模型。问问自己这个简单的问题:
- 我的路由是否会使用slug根据url加载动态数据
:id
?即
this.resource('foo', {path: ':id'});
如果您回答是
请勿尝试从该路线中的模型挂钩加载多个模型!!!!原因在于Ember处理与路线的链接的方式。如果您在链接到该路线时提供了模型({{link-to 'foo' model}}
,transitionTo('foo', model)
)它将跳过模型钩子并使用提供的模型。这可能是有问题的,因为您期望有多个模型,但是只能交付一个模型。这是一个替代方案:
在setupController
/afterModel
App.IndexRoute = Ember.Route.extend({
model: function(params) {
return $.getJSON('/books/' + params.id);
},
setupController: function(controller, model){
this._super(controller,model);
controller.set('model2', {bird:'is the word'});
}
});
示例:http://emberjs.jsbin.com/cibujahuju/1/edit
如果您需要它来阻止过渡(如模型钩子一样),则从钩子中返回一个Promise afterModel
。您将需要手动跟踪该挂钩的结果,并将其挂钩到您的控制器。
App.IndexRoute = Ember.Route.extend({
model: function(params) {
return $.getJSON('/books/' + params.id);
},
afterModel: function(){
var self = this;
return $.getJSON('/authors').then(function(result){
self.set('authors', result);
});
},
setupController: function(controller, model){
this._super(controller,model);
controller.set('authors', this.get('authors'));
}
});
示例:http://emberjs.jsbin.com/diqotehomu/1/edit
如果你回答不
继续,让我们从路线的模型挂钩返回多个模型:
App.IndexRoute = Ember.Route.extend({
model: function() {
return {
model1: ['red', 'yellow', 'blue'],
model2: ['green', 'purple', 'white']
};
}
});
示例:http://emberjs.jsbin.com/tuvozuwa/1/edit
如果需要等待(例如对服务器的调用,某种承诺)
App.IndexRoute = Ember.Route.extend({
model: function() {
return Ember.RSVP.hash({
model1: promise1,
model2: promise2
});
}
});
示例:http://emberjs.jsbin.com/xucepamezu/1/edit
如果是灰烬数据
App.IndexRoute = Ember.Route.extend({
var store = this.store;
model: function() {
return Ember.RSVP.hash({
cats: store.find('cat'),
dogs: store.find('dog')
});
}
});
示例:http://emberjs.jsbin.com/pekohijaku/1/edit
如果一个是一个承诺,而另一个不是,那一切都很好,RSVP会很乐意使用该值
App.IndexRoute = Ember.Route.extend({
var store = this.store;
model: function() {
return Ember.RSVP.hash({
cats: store.find('cat'),
dogs: ['pluto', 'mickey']
});
}
});
示例:http://emberjs.jsbin.com/coxexubuwi/1/edit
混合搭配,玩得开心!
App.IndexRoute = Ember.Route.extend({
var store = this.store;
model: function() {
return Ember.RSVP.hash({
cats: store.find('cat'),
dogs: Ember.RSVP.Promise.cast(['pluto', 'mickey']),
weather: $.getJSON('weather')
});
},
setupController: function(controller, model){
this._super(controller, model);
controller.set('favoritePuppy', model.dogs[0]);
}
});
示例:http://emberjs.jsbin.com/joraruxuca/1/edit