EmberJS:使用ajax加载的父模型初始化嵌套模型

时间:2013-09-14 13:21:06

标签: javascript ember.js

我得到了以下简单的ember.js-setup,它可以很好地运行

App.Router.map(function() {
    this.resource('tourdates', function() {
        this.resource('tourdate', { path: ':tourdate_id' });
    });
});

App.TourdatesRoute = Ember.Route.extend({
    model: function() {
        return $.getJSON('http://someapi.com/?jsoncallback=?').then(function(data) {
            return data;
        });
    }
});

App.TourdateRoute = Ember.Route.extend({
    model: function(params) {
        return tourdates.findBy('id', params.tourdate_id);
    }
});

所以,很简单,每当我调用index.html#/ tourdates时,我都会通过api获取数据。当我点击此视图中的链接并调用f.e. index.html#/ tourdates / 1它只显示其嵌套子项的视图。

当我直接使用消息

调用index.html#/ tourdates / 1时,这一切都会中断
DEPRECATION: Action handlers contained in an `events` object are deprecated in favor of putting them in an `actions` object (error on <Ember.Route:ember174>)
Error while loading route: ReferenceError {} 
Uncaught ReferenceError: tourdates is not defined 

虽然他对api进行ajax调用并获取数据,但他无法初始化嵌套模型

1 个答案:

答案 0 :(得分:0)

加载App.TourdatesRoute时,将呈现来自json的所有数据。当你点击编辑其中一个加载对象时,例如使用链接,ember足够聪明,可以获取已经引用的对象,而不是发送新请求。因此,您的网址将更改为:yourhost.com/tourdate/id

当您直接致电此网址时,它会调用App.TourdateRoute model方法。因为没有任何预加载的数据。但在你的情况下你有一个:

tourdates.findBy('id', params.tourdate_id);

我无法在任何地方看到tourdates的声明。

我建议您将TourdateRoute更改为TourdateIndexRoute,以便在转换到tourdates时执行ajax调用一次:

App.TourdatesIndexRoute = Ember.Route.extend({
    model: function() {
        return $.getJSON('http://someapi.com/?jsoncallback=?').then(function(data) {
            return data;
        });
    }
});

TourdatesRouteTourdateRoute都会调用TourdatesIndexRoute,因为它是两者的父路由。因此,获取TourdatesIndexRoute中的所有数据将确保在转换为tourdates时调用此数据。

TourdateRoute中,您只会加载所需的记录。像这样:

App.TourdateRoute = Ember.Route.extend({
    model: function(params) {
        // retrieve just one data by id, from your endpoint
        return $.getJSON('http://someapi.com/' + params.tourdate_id + '?jsoncallback=?').then(function(data) {
            return data;
        });
    }
});

因此,直接调用yourhost.com/tourdate/id只会加载一条记录。

关于您的警告信息,因为在某些路线中您有:

App.MyRoute = Ember.Route.extend({
  events: {
    eventA: function() { ...},
    eventB: function() { ...},
  }
});

{@ 1}}已弃用,您需要使用events

actions

我希望它有所帮助