[英]How to wait until find method has finished before doing further processing in Ember Model
我怎么能等到我的find方法從后端加載模型? 模型加載后,我想獲取其他數據並用該數據修飾我的電影模型。 對獲取附加數據的外部api的請求基於電影模型的屬性,如年份和標題。
App.Movie.adapter = Ember.Adapter.create({
find: function(record, objectId) {
return Ember.$.ajax({
headers: {
'X-Parse-Application-Id': '',
'X-Parse-REST-API-Key': ''
},
type: 'GET',
url: 'https://api.parse.com/1/classes/Movie' + '/' + objectId
}).then(function(data) {
record.load(objectId, data);
});
}
});
App.MoviesMovieRoute = Ember.Route.extend({
model: function (movie) {
return App.Movie.find(movie.movie_id);
},
afterModel: function(movie, transition) {
// currently undefined, undefined
console.log(movie.get('title'), movie.get('year'));
}
});
App.MoviesMovieController = Ember.ObjectController.extend({
contentObserver: function () {
// fetch additional data from external api
}.observes('content')
});
謝謝
對於ember模型,使用fetch,它將返回promise,並且ember將等到解析該模型之后再進行下一個模型。
return App.Movie.fetch(movie.movie_id);
find構建一個虛擬記錄並立即返回記錄(並在數據可用時填充它),而fetch構建記錄和一個promise,並返回promise,當它被填充時解析為記錄。
他們都將使用適配器中的find方法。
App.MoviesMovieRoute = Ember.Route.extend({
model: function (movie) {
return App.Movie.find(movie.movie_id);
},
afterModel: function(movie, transition) {
// currently undefined, undefined
console.log(movie.get('title'), movie.get('year'));
},
serialize: function(model){
return { movie_id: model.get('whateverfieldhastheid')};
}
});
一種方法是使用RSVP Promise實現find(),如下所示:
App.Movie = Ember.Object.extend({
});
App.Movie.reopenClass({
find: function(objectId) {
return Ember.RSVP.Promise(function(resolve, reject) {
Ember.$.ajax({
type: 'GET',
url: 'https://api.parse.com/1/classes/Movie' + '/' + objectId
}).success(function(data) {
resolve(data);
}).fail(function(data) {
reject(data);
})
}
}
});
然后,在您的路線中,您可以添加到您的承諾:
App.MoviesMovieRoute = Ember.Route.extend({
model: function (movie) {
var movie = App.Movie.find(movie.movie_id);
movie.then(function() {
// Gets called once the server returned loaded
console.log(movie.get('title'), movie.get('year'));
}, function() {
// FailureHandler
});
return movie;
},
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.