0

我得到了以下简单的 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 获取数据。当我单击此视图中的链接并调用 fe 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 调用并获取了数据,但他无法初始化嵌套模型

4

1 回答 1

0

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

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

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

而且我在任何地方都看不到tourdates.

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

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

TourdatesRoute都调用了TourdateRouteTourdatesIndexRoute因为它是两者的父路由。因此,获取 中的所有数据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() { ...},
  }
});

events弃用,您需要使用actions

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

我希望它有帮助

于 2013-09-14T18:25:30.903 回答