Мне нужна динамическая часть сегмента «model/thing/1» URL-адреса, поскольку я пытаюсь получить доступ к данным модели в контроллере приложения из модели, загруженной в настоящий момент во вложенном маршруте. Есть ли способ получить доступ к динамической части этого URL-адреса или есть другой способ как-то получить доступ к этим данным?Как получить динамическую часть currentRouteName в Ember js
ответ
Если все, что вам нужно, чтобы отобразить данные модели (или какие-либо данные) где-то на странице (не в текущем шаблоне), то вы можете использовать либо ember-elsewhere, либо ember-wormhole.
Для доступа к параметрам маршрута вы можете ввести частный routing service и использовать его currentState.routerJsState.params
. Свойство содержит каждый доступный маршрут Params индексированного по имени текущего маршрута, как это:
{
application: {},
test: {
model_id: "19"
},
test.nested: {
nested_id: "1"
}
}
Например, для отображения текущего Params маршрута нам нужно что-то вдоль этих линий:
контроллеров/application.js (может быть компонент или любой уголек объект)
import Ember from 'ember';
export default Ember.Controller.extend({
routing: Ember.inject.service('-routing'),
params: Ember.computed('routing.currentState', 'routing.currentRouteName', function() {
let allParams = this.get('routing.currentState.routerJsState.params');
let routeName = this.get('routing.currentRouteName');
return allParams[routeName];
}),
jsonParams: Ember.computed('params', function() {
let params = this.get('params');
return JSON.stringify(params);
})
});
шаблоны/application.hbs
<div>params={{jsonParams}}</div>
Другой вариант - создать службу и заполнить ее необходимыми данными в afterModel
крючком на соответствующих маршрутах.
услуги/данных service.js:
import Ember from 'ember';
export default Ember.Service.extend({
});
Уплотненный маршрут:
маршруты/nested.js
import Ember from 'ember';
export default Ember.Route.extend({
dataService: Ember.inject.service('data-service'),
afterModel(model, transition) {
this.get('dataService').set('model', model);
}
});
Контроллеры/application.js:
import Ember from 'ember';
export default Ember.Controller.extend({
dataService: Ember.inject.service('data-service')
});
шаблоны/application.hb s:
<div>{{dataService.model}}</div>
Так как вы, вероятно, не хотят, чтобы отобразить эти данные во всех маршрутах, то вы можете внедрить услугу маршрутизации и использовать currentRouteName
свойство решить, когда, чтобы показать его.
Это идеальное решение для получения параметров маршрута, хотя оно возвращает его как вычисленное свойство, и мне оно нужно как строка, поскольку мне нужно передать его в findRecord. Я собираюсь попробовать червоточину. Благодаря! –
ДА. Wormhole работает! Ты спасатель. Это было именно то, что мне нужно. –
Первый параметр в крюке model
: params
, в котором содержится то, что вы ищете.
Это объясняется в руководствах: https://guides.emberjs.com/v2.11.0/routing/specifying-a-routes-model/#toc_dynamic-model
Пример:
import Ember from 'ember';
export default Ember.Route.extend({
model(params) {
return this.get('store').findRecord('photo', params.photo_id);
}
});
Спасибо, но мне нужно получить доступ к параметрам в маршруте или контроллере приложения. Это возможно? –
№ По понятным причинам. Что делать, если вы перешли к /? – Gaurav
Я бы не спросил, были ли причины для меня очевидны. Не могли бы вы уточнить? И в чем проблема с возвратом пустой строки в этом случае или что-то подобное? –
вы получаете его в маршруте 'model' hook. – Lux