Javascript 如何等到find方法完成后再在Ember模型中进行进一步处理
如何等待find方法完成从后端加载模型?加载模型后,我想获取其他数据,并用这些数据装饰我的电影模型。对从中获取附加数据的外部api的请求基于电影模型的属性,如年份和标题Javascript 如何等到find方法完成后再在Ember模型中进行进一步处理,javascript,ember.js,ember-model,Javascript,Ember.js,Ember Model,如何等待find方法完成从后端加载模型?加载模型后,我想获取其他数据,并用这些数据装饰我的电影模型。对从中获取附加数据的外部api的请求基于电影模型的属性,如年份和标题 App.Movie.adapter = Ember.Adapter.create({ find: function(record, objectId) { return Ember.$.ajax({ headers: { 'X-Parse-Application-Id': '',
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,它将返回承诺,ember将等待解决该模型,然后再执行下一个模型
return App.Movie.fetch(movie.movie_id);
find构建一个虚拟记录并立即返回该记录(并在数据可用时填充该记录),而fetch构建该记录和一个承诺并返回承诺,该承诺在填充该记录时解析为该记录
它们都将使用适配器中的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承诺实现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;
},
});
- 请注意,这根本不使用数据。我不知道这是不是一个要求