Углубленные глубоко вложенные маршруты не поддерживают родительский динамический параметр
У меня есть это приложение 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;
}