为什么Ember.js中的嵌套资源不保留params哈希?

Ker*_*ick 10 routes ember.js

给定以下Ember.js应用程序(使用Ember 1.0.0.rc.6.1和Ember Data 0.13):

App = Ember.Application.create({ LOG_TRANSITIONS: true });

App.Store = DS.Store.extend();

App.Router.map(function() {
    this.resource('promotions', function() {
        this.resource('promotion', { path: '/:promotion_id' }, function() {
            this.resource('entrants', function() {
                this.resource('entrant', { path: '/:entrant_id' });
            });
        });
    });
});

App.PromotionRoute = Ember.Route.extend({
    model: function() {
        return { id: 1, name: 'My Promotion' };
    }
});

App.EntrantsIndexRoute = Ember.Route.extend({
    model: function(params) {
        console.warn('EntrantsIndexRoute', '\nparams:', params, '\nparams.promotion_id:', params.promotion_id, '\narguments:', arguments);
        console.log('params should be:', { promotion_id: 1 });
        console.log('The queried URL should be:', '/entrants?promotion_id=1');
        return App.Entrant.find({promotion_id: params.promotion_id});
    }
});

App.Entrant = DS.Model.extend({
    name: DS.attr('string')
});
Run Code Online (Sandbox Code Playgroud)

如果输入url #/promotions/1/entrants(应该是嵌套资源),则params是一个空对象.我怎么去promotion_id那里?JSFiddle在这里,点击"点击我"后查看控制台:http://jsfiddle.net/Kerrick/4GufZ/

Gos*_*ich 20

虽然您无法访问父路由的动态段,但仍可以检索父路由的模型并获取其ID,如下所示:

App.EntrantsIndexRoute = Ember.Route.extend({
  model: function() {
    var promotion_id = this.modelFor('promotion').id;
    return App.Entrant.find({ promotion_id: promotion_id });
  }
});
Run Code Online (Sandbox Code Playgroud)

或者,如果促销和参赛者之间存在多种关系,您甚至可以这样做:

App.EntrantsIndexRoute = Ember.Route.extend({
  model: function() {
    return this.modelFor('promotion').get('entrants');
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 这个答案似乎给出了一个解决方案,但没有回答为什么嵌套资源无法访问参数的基本问题 (5认同)
  • 这是在Ember指南中的某个地方吗?我在任何地方都找不到...... (4认同)