1

在我的 ember 应用程序中,我有一个带有嵌套资源的路由器,如下所示:

App.Router.map(function () {
  this.resource('explore', function() {
    this.resource('building', { path: 'building/:slug' });
    this.resource('country', { path: ':slug' }, function() {
        this.resource('state', {path: ':slug' });
    });
  });
});

App.CountryRoute = Ember.Route.extend(App.SlugRouter, {
  setupController: function(controller, country) {
    controller.set('title', 'country detail');
    controller.set('model', country);
  }
});

App.SlugRouter = Ember.Mixin.create({
    serialize: function(model, params) {
        var name, object;
        object = {};
        name = params[0];
        object[name] = model.get('slug');
        return object;
    }
});

App.Building = DS.Model.extend({
    country: DS.belongsTo('App.Country'),
    name: DS.attr('string'),
    slug: DS.attr('string')
});

App.Country = DS.Model.extend({
  name: DS.attr('string'),
  slug: DS.attr('string'),
  buildings: DS.hasMany('App.Building'),
  states: DS.hasMany('App.State')
});

加载探索路线会显示从服务器(一个 django-rest-framework 应用程序)接收到的建筑物列表,每个建筑物都与具有 belongsTo 属性的国家/地区有关系。

在 explore.index 路线中,我显示了建筑物列表,并使用{{linkTo this.country}}. 然而,href 被加载为#/explore/undefined,而不是#/explore/<country-name>

让我感到困惑的是,这只发生在我第一次加载列表时。如果我去另一条路线,然后回到#/explore,链接会正确呈现。

在调试器中,在 serialize 方法中放置一个断点,我看到我第一次加载页面时,模型对象是空的(_data.attributes 是一个空对象)。转到调试器中的网络选项卡,我看到已向服务器发出请求以获取国家/地区数据,但尚未收到响应:

尚未收到服务器响应

最终会收到响应,因为{{this.country.name}}渲染正确,但为时已晚。

提前感谢您的任何回复/提示。

我正在使用:Ember:1.0.0-rc.5,Handlebars:1.0.0-rc.4,jQuery:1.8.3,ember-data:0.13,ember-data-django-rest-adapter:0.13

4

1 回答 1

2

首先,您在App.SlugRouter定义之前混合。您应该会Assertion failed: Expected hash or Mixin instance, got [object Undefined]在控制台中看到类似的错误。

之后,您需要通过 slug 为一个国家/地区加载模型。我也没有在您的路线中看到这一点。CountryRoute根据您的持久性库,您需要这样的东西。

model: function(params) {
  return App.Country.find({slug: params.slug});
}

我怀疑现在正在工作的部分是因为您的索引路由正在加载模型并将其传递setupControllerlinkTo. 直接加载嵌套页面需要配置该路由的模型挂钩。

于 2013-07-19T14:55:25.843 回答