Angular-ui-router: загрузить одно из дочерних состояний по умолчанию из родительского абстрактного состояния

#angularjs #angular-ui-router

#angularjs #angular-ui-router

Вопрос:

Мое приложение использует Angularjs-ui-router для переключения между различными модулями.у меня есть 2 дочерних состояния из родительского состояния. мне нужно загрузить состояние ‘home.search’ по умолчанию и ‘home.fileupload’ при нажатии кнопки, но в настоящее время ‘home.загружается состояние fileupload tabs.html слишком.

есть ли способ при вводе страницы загрузить состояние по умолчанию как состояние «home.search» и при нажатии кнопки загрузить «home».состояние fileupload’ из родительского абстрактного состояния (home.html )???

routes.js

   .state('home', {
          abstract: true, 
          templateUrl: 'scripts/home.html'
   })

  .state('home.search', {
       url: '/summary',
       views: {               
          'search': 
          {
                    templateUrl: "scripts/home/search.html"
          },
          'summary': 
          {
                    templateUrl: "scripts/home/summary.html"
          }
      }
   })
  .state('home.fileupload', {
      url: '/fileupload',
      views: {               
       'upload': 
          {
                    templateUrl: "scripts/home/upload.html"
          }
       }
  })
  

home.html

  <button type="button" ng-click="goToState('home.search')">Search</button>
 <button type="button" ng-click="goToState('home.fileupload')">fileUpload</button>
 <div ng-include="'scripts/home/tabs.html'"></div>  
  

tabs.html

  <div ng-controller="MainCtrl">    
  <div ui-view="summary"></div>   
  <div ui-view="search"></div>
 </div>   
  

Ответ №1:

Существует ссылка на рабочий пример. Я внес несколько изменений, чтобы сделать его более ui-router похожим.

Во-первых, мы должны переместить определение контроллера из <div ng-controller="MainCtrl"> в определение состояния:

 $stateProvider
  .state('home', {
    abstract: true,
    templateUrl: 'scripts/home.html',
    controller: 'MainCtrl', // here we put together template and controller
  })

.state('home.search', {
  url: '/summary',
  views: {
    'search': {
      templateUrl: "scripts/home/search.html",
      controller: 'SearchCtrl', // here as well
    },
    'summary': {
      templateUrl: "scripts/home/summary.html",
      controller: 'SummaryCtrl', // here also
    }
  }
})
...
  

кроме того, часть шаблона для абстрактного состояния home должна быть <div ui-view="upload"></div> , как заполнитель для состояния загрузки файла.

И это только начало:

 .config(['$urlRouterProvider',
    function($urlRouterProvider) {

      $urlRouterProvider.otherwise('/summary');
    }
 ]);
  

Проверьте все это в плунжере

Ответ №2:

Вы можете использовать метод module.run() для установки маршрута по умолчанию. Вот как вы это делаете:

 testModule = angular.module('ModuleName', []);
testModule.run(['$rootScope', '$state', function($rootScope, $state) {
$state.go('statename');
}]);
  

Блок запуска выполняется при загрузке приложения. Прочитайте о блоках запуска, если у вас есть какая-либо путаница: https://docs.angularjs.org/guide/module