Подтвердить что ты не робот

Angular UI-маршрутизатор - параметры состояния доступа в родительском

У меня есть приложение Angular, использующее большой ui-маршрутизатор.

Моя настройка выглядит так:

.config( function ($stateProvider, $urlRouterProvider) {

    $stateProvider

    // PROJECT DETAIL
    .state('project', {
        url: '/project/:projectId/',
        resolve: {
            /* some base api calls */
        },
        views: {
            'task-list': {
                templateUrl: 'partials/task_list.tmpl.html',
                controller: 'TaskListCtrl',
                resolve: {
                    tasks: function ($stateParams, ConcernService) {
                        return ConcernService.get('project-tasks/', $stateParams.projectId);
                    },
                }
            },
            'concern-instance': {
                /* some resolved variables */
            }
        }
    })
    .state('project.task', {
        url: 'task/:taskId/',
        views: {
            '[email protected]': {
                /* some different resolved variables */
            },
        }
    })

Все это работает как масло. Однако в моем шаблоне task_list, когда в состоянии project.task, я хочу иметь доступ к параметру taskId, чтобы я мог выделить активные ссылки навигации, даже когда URL-адрес #/project/123/task/456/ taskId пуст. Я понимаю, что это потому, что шаблоны имеют доступ только к параметрам, объявленным для этого состояния. Итак, если я хочу получить taskId в состоянии project.task, как мне это сделать? Должен ли я повторно объявить task-list в porject.task?

Любая помощь очень ценится.

4b9b3361

Ответ 1

В документации UI-Router здесь они объясняют, что

"объект $stateParams будет содержать только те параметры, которые были зарегистрированный в этом состоянии.

Доступ к параметрам родительского состояния можно только в дочернем состоянии, используя свойство разрешения родителя.

Поместите это в состояние 'project' (родительский):

...    
resolve: {
    // Expose projectId parameter to child states
    projectId: ['$stateParams', function ($stateParams) {
        return $stateParams.projectId;
    }]
},

Затем внутри вашего контроллера для вашего состояния 'project.task' (дочерний элемент) вы должны иметь доступ к

$stateParams.projectId

и

$stateParams.taskId

Ответ 2

Я заметил, что $state.params содержит параметры дочернего состояния. Кажется, не может найти никакой документации. Он просто работает

Ответ 3

Как вы пытаетесь получить доступ к taskId? Это должно быть так, взято из официальной документации:

$stateProvider
    .state('contacts.detail', {
        url: "/contacts/:contactId",
        templateUrl: 'contacts.detail.html',
        controller: function ($stateParams) {
            // If we got here from a url of /contacts/42
            expect($stateParams).toBe({contactId: 42});
        }
    })