1

Я хочу, чтобы загрузить data и params для каждого состояния один раз, когда приложение нагрузки от моей службы settings (эта служба возвращает также promise поскольку данные загружаются асинхронно).
Что-то вроде этого:Угловой UI-маршрутизатор: значения нагрузки для данных и Params от службы

.state('tutorials', { 
    url: '/tutorials', 
    templateUrl: 'partials/tutorials.html', 
    controller: 'TutorialsCtrl', 
    data: {details: false}, // instead of false I want: settings.get('tutorials_data_details') 
    params: {popular: '512'} // instead of '512' I want: settings.get('tutorials_params_popular') 
    }) 

Те params должны быть загружены для всех государств перед входом в любое состояние, так как они используются для построения связей с ui-sref директивы, которые могут быть размещены в любом html указывающей в любом состоянии (и те, по умолчанию params).

Проблема в том, что я не могу ввести service в функцию config. И использование resolve не будет обрабатывать все состояния сразу.

Я думаю, что можно использовать $stateProvider.decorator, но я не знаю как.

ответ

0

Я бы прокомментировал, но недостаточно репутации для этого.

Если это возможно, один из вариантов является создание родителя абстрактного состояния, такие как app, поэтому ваше состояние дерева стало бы app.tutorials, а затем вы можете использовать resolve на app состоянии, что позволяет все суб-государства использовать данные/PARAMS.

что-то вроде этого:

.state('app', { 
url: '', 
abstract: true, 
templateUrl: 'partials/tutorials.html', 
controller: 'AppCtrl', 
resolve: { <resolve your dependencies here> } 
}) 

.state('app.tutorials', { 
    url: '/tutorials', 
    templateUrl: 'partials/tutorials.html', 
    controller: 'TutorialsCtrl' 
}) 

Обратите внимание на учебники состояние обыкновение нагрузки до тех пор, решительность не будет завершена.

0

После некоторых исследований и думая, что я придумал эти 3 возможных решений:

1) С помощью decorator мы делаем все государства разрешающих settings обслуживания.

.decorator('data', function(state, parent) { 
    state.resolve.SettingsLoaded = ['settings', function(settings) { return settings.$promise; }]; 
    return parent(state); 
}) 

Затем в settings службе использование нагрузки успех обратного вызова для состояний настройки. Вы можете использовать $state.get(), чтобы получить все состояния (или с параметром string для получения определенного состояния по имени) и изменить объект params.
ПРИМЕЧАНИЕ, что вы не можете использовать короткую версию, такую ​​как state.params.popular = '512', но полный: state.params.popular.value = '512'.

2) Эти params могут быть фактически функциями, которые будут введены и вызваны, и будет использовано значение результата. Таким образом, новое определение params в state будет:

params: {popular: ['settings', function(settings) { return settings.get('tutorials_params_popular') || '512'; }]} 

Также я снова использовал тот же decorator, чтобы убедиться, что settings будет решен до загрузки какого-либо государства.
Мне нравится этот подход больше всего, так как все значения параметров остаются в сервисе settings, и изменение динамически отражается.

3) Поскольку я использую RequireJS, я мог бы загрузить настройки, используя это, а затем ввести его в файл маршрутизатора. Тем не менее, это потребует дополнительных изменений в излучении кода в моем settings ...