ОСТОРОЖНО:
Ви хочете бути обережними щодо того, чи доцільно повертати кілька моделей у вашому гачку моделі. Задайте собі таке просте запитання:
- Чи завантажує мій маршрут динамічні дані на основі URL-адреси за допомогою кулі
:id
? тобто
this.resource('foo', {path: ':id'});
Якщо ви відповіли ствердно
Не намагайтеся завантажувати кілька моделей із гачка моделі в цьому напрямку !!! Причина криється в тому, як Ембер обробляє посилання на маршрути. Якщо ви надаєте модель під час посилання на цей маршрут ( {{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
Якщо вам це потрібно для блокування переходу (як це робить модельний гачок), поверніть обіцянку з 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
У випадку даних Ember
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