вложенные состояния пользовательского интерфейса маршрутизатора, базовое понимание

#angularjs #angular-ui-router

#angularjs #angular-ui-router

Вопрос:

Я пытаюсь создать конфигурацию вложенного состояния. Когда я использую простой не вложенный, это работает, но когда я пытаюсь сделать это вложенным способом, это терпит неудачу.

Ниже приведен рабочий код: (Обратите внимание на последнее состояние «новое»)

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

    $stateProvider
     .state('home', {
        url: '/home',
        templateUrl: '/views/home.html',
        controller: 'MainCtrl',
        resolve: {
            qstnrPromise: ['qstnrs', function(qstnrs) {
                return qstnrs.getAll();
            }]
        }
     })

     .state('questionnaires', {
        url: '/questionnaires/{id}',
        templateUrl: '/views/questionnaire.html',
        controller: 'QuestionsCtrl',
        resolve: {
            questionnaire: ['$stateParams', 'qstnrs', function($stateParams, qstnrs){
                return qstnrs.get($stateParams.id);
            }]
        }
     })

     .state('new', {
        url: '/questionnaires/{id}/new',
        template: '<h3> testy </h3>'
     });


     //$urlRouterProvider.otherwise('home');
     $urlRouterProvider.otherwise(function($injector, $location){
        $injector.invoke(['$state', function($state) {
            $state.go('home');
        }]);
     });
});
  

Если я попытаюсь изменить его следующим образом, это не удастся. URL-адрес в браузере изменяется, но я не получаю шаблон.

  .state('questionnaires.new', {
    url: '/new',
    template: '<h3>New question</h3>'
 });
  

Я неправильно понял состояния? Или где я ошибся?

Ответ №1:

Попробуйте изменить свое новое состояние на:

 .state('new', {
  url: '/new',
  parent: 'questionnaires',
  template: '<h3>New question</h3>'
})
  

Посмотрите, работает ли это для вас.

Ответ №2:

Вы можете сделать состояние вопросников абстрактным.

 $stateProvider
.state('questionnaires', {
    abstract: true,
    url: '/questionnaires',
})
.state('questionnaires.new', {
    // url will become '/questionnaires/new'
    url: '/new'
    //...more
})
  

Но в этом случае вам нужно будет добавить одно дополнительное вложенное состояние, чтобы реализовать функциональность, необходимую для $stateParams.id.