Углубленные глубоко вложенные маршруты не поддерживают родительский динамический параметр

У меня есть это приложение Ember:

Ember       : 1.3.2
Ember Model : 0.0.11
Handlebars  : 1.3.0
jQuery      : 1.9.1 

Используя эту карту ресурсов:

App.Router.map(function () {
  this.resource('dimensions', function() {
    this.resource('dimension', { path: ':dimension_id'}, function () {
      this.resource('value', { path: 'values/:value_id' });
    });
  });
});

И это позволяет мне встраивать {{outlet}} в шаблон "измерения", который заполняется шаблоном "измерения", и встраивать {{outlet}} в шаблон "измерения", который также заполняет шаблон "значения".

Все работает очень хорошо, за исключением помощника link-to в шаблоне "value", который не принимает больше параметров и не принимает другие модели, как описано в документации ember API.

Каков наилучший способ работы со связью в глубоко вложенных маршрутах?

У меня есть эта скрипка, чтобы показать мою проблему: http://jsfiddle.net/vsiguero/pQpE3/5/

Спасибо за вашу помощь!

Ответ 1

РЕДАКТИРОВАТЬ: метод paramsFor был добавлен через некоторое время после того, как я написал этот ответ, что делает это возможным. Обратитесь к ответу @nickiaconis для получения более подробной информации.


Если я вас правильно понимаю, я думаю, что вы столкнулись с ожидаемым поведением. Параметры для маршрута являются уникальными для этого маршрута. Я не уверен на 100%, почему это так, но значения динамических сегментов не передаются дочерним маршрутам. Вместо этого вам нужно получить доступ к модели напрямую. В вашем маршруте value вы можете использовать this.modelFor('dimension') чтобы получить модель, которая была разрешена для маршрута dimension.

Ответ 2

Вы можете получить доступ к параметрам родительских маршрутов с детского маршрута следующим образом:

this.paramsFor(parent_route_name).param_name

Итак, вы сделали бы что-то подобное в своем файле /app/routes/dimensions/dimension/value.js:

export default Ember.Route.extend({
  model: function(params, transition) {
    var dimension_id = this.paramsFor('dimension').dimension_id;
    // do whatever you need with dimension_id and params.value_id
  }
});

Вот вилка вашего jsFiddle, измененная и работающая: http://jsfiddle.net/niaconis/kxejh9yr/
Обратите внимание, что я обновил Ember.

Вот документация для Route#paramsFor: http://emberjs.com/api/classes/Ember.Route.html#method_paramsFor

Ответ 3

Я считаю, что последний ember 1.5+ применяет любые модели или литеральные значения, предоставляемые помощнику link-to от дочернего к родительскому, поэтому вам не нужно предоставлять модели для полного пути модели, поскольку они будут по умолчанию использовать текущий маршрут пути.

Также у вас есть доступ к родительским моделям через аргумент перехода, переданный в model(), с использованием transition.resolvedModels из памяти. Каждый сегмент динамического маршрута в маршруте маршрута будет атрибутом для этого объекта, поэтому убедитесь, что ваш DSL маршрутизатора указывает разные имена для каждого имени параметра сегмента (как вы это делаете в настоящее время). Итак, в вашем ValueRoute вы можете сделать что-то вроде:

model: function(params,transition) {
    return transition.resolvedModels.dimension;
}