Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何等到find方法完成后再在Ember模型中进行进一步处理_Javascript_Ember.js_Ember Model - Fatal编程技术网

Javascript 如何等到find方法完成后再在Ember模型中进行进一步处理

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': '',

如何等待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,它将返回承诺,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;
    },
});
  • 请注意,这根本不使用数据。我不知道这是不是一个要求

尝试在方法末尾键入打印语句。这将表明该方法已经实现了如何以异步方式运行ajax调用:false?它必须在继续之前获得一个答案。是否可以从动态url部分获取id?那么,在页面/浏览器重新加载后,单个视图的渲染是否正确?我是否必须将return语句放在ajax请求前面以返回承诺,还是可以省略该return语句?THX id和url部分似乎正常。但我在控制台中收到了这样一条错误消息:“断言失败:无法在未定义的对象上使用'id'调用get。”知道吗?您需要在路由中实现序列化钩子。我会给你举个例子。对不起…;-)但现在只有一个白色的屏幕。控制台中不会呈现任何内容,也不会显示任何错误消息。可能的原因是单一视图是列表视图的子例程?ThxIt以前是什么?