2017-02-13 36 views
0

Мне нужна динамическая часть сегмента «model/thing/1» URL-адреса, поскольку я пытаюсь получить доступ к данным модели в контроллере приложения из модели, загруженной в настоящий момент во вложенном маршруте. Есть ли способ получить доступ к динамической части этого URL-адреса или есть другой способ как-то получить доступ к этим данным?Как получить динамическую часть currentRouteName в Ember js

+0

вы получаете его в маршруте 'model' hook. – Lux

ответ

1

Если все, что вам нужно, чтобы отобразить данные модели (или какие-либо данные) где-то на странице (не в текущем шаблоне), то вы можете использовать либо 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 свойство решить, когда, чтобы показать его.

+0

Это идеальное решение для получения параметров маршрута, хотя оно возвращает его как вычисленное свойство, и мне оно нужно как строка, поскольку мне нужно передать его в findRecord. Я собираюсь попробовать червоточину. Благодаря! –

+0

ДА. Wormhole работает! Ты спасатель. Это было именно то, что мне нужно. –

0

Первый параметр в крюке 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); 
    } 
}); 
+0

Спасибо, но мне нужно получить доступ к параметрам в маршруте или контроллере приложения. Это возможно? –

+0

№ По понятным причинам. Что делать, если вы перешли к /? – Gaurav

+0

Я бы не спросил, были ли причины для меня очевидны. Не могли бы вы уточнить? И в чем проблема с возвратом пустой строки в этом случае или что-то подобное? –