0

我怎样才能等到我的 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')
});

谢谢

4

2 回答 2

0

对于 ember 模型,使用 fetch,它会返回 Promise,而 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')};
  }
});
于 2013-11-22T19:41:25.087 回答
0

一种方法是使用 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);
            })
        }
    }
});

然后,在您的路线中,您可以将 then 添加到您的承诺中:

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;
    },
});
  • 请注意,这根本不使用 EmberData。不知道有没有这个要求?
于 2013-11-22T20:07:40.233 回答