2015-04-22 4 views
0

У меня есть абстрактный базовый шаблон, который загружает навигацию по типу пользователя. Эта часть работает при начальной загрузке. Проблема в том, что я не могу заставить родительский шаблонProvider перезагружаться, когда пользователь вошел в систему или вышел из него. Я попробовал решения here, чтобы перезагрузить родительский шаблон, но шаблоны nav не затрагиваются. Есть ли способ перезагрузить templateProvider или лучший способ сделать это? В идеале мне не нужно будет добавлять навигатора к каждому дочернему маршруту.Угловой ui.router перезагрузить родительский шаблонProvider

Маршруты:

$stateProvider 
     .state('base', { 
      abstract: true, 
      views: { 
       content: { 
        template: '<ui-view></ui-view>', 
       }, 
       nav: { 
        templateProvider: function ($templateFactory, User, $stateParams){ 
         if(User.exists()){ 
          var url = '/static/html/navs/' + User.get.type + '.html'; 
          return $templateFactory.fromUrl(url); 
         } 
         else{ 
          return false; 
         } 
        } 
       } 
      } 
     }) 

     .state('base.index', { 
      url: '/', 
      controller: 'loginController', 
      templateUrl: 'static/html/landing/login.html' 
     }) 

функции контроллера с попытками от github issue:

scope.login_submit = function(e){ 
    e.preventDefault(); 
    User.login(scope.login, function(res){ 
     $state.transitionTo(
      'base.dashboard', null, 
      {reload: true, inherit: true, notify: true } 
     ); 
    }); 
}; 

ответ

0

Я создал working example here. Он исходит из этого Q & A

Это будет скорректированное состояние Защиты:

.state('base', { 
    abstract: true, 
    views: { 
     '': { 
      template: '<ui-view></ui-view>', 
     }, 
     /* 
     nav: { 
      templateProvider: function ($templateFactory, User, $stateParams){ 
       if(User.exists()){ 
        var url = '/static/html/navs/' + User.get.type + '.html'; 
        return $templateFactory.fromUrl(url); 
       } 
       else{ 
        return false; 
       } 
      } 
     },*/ 
     nav: { 
      templateProvider: ['User', '$templateRequest', function(User, templateRequest){ 

      var tplName = 'templates/templateNotExists.html'; 

      if(User.exists) { 

       tplName = 'templates/templateExists.html'; 
      } 

      return templateRequest(tplName); 
      }], 
     }, 
    } 
}) 

Как мы можем видеть, мы используем новая функция называется '$templateRequest', чтобы получить шаблон HTML с сервера, на основе url.

и эти контроллеры и услуги

.controller('loginController', ['$scope', 'User', function ($scope, User) { 
    $scope.User = User; 
}]) 
.factory('User', function(){ return { exists: false, }; }) 

И это содержание шаблона ребенка 'base.index' состояние:

<input type="checkbox" ng-model="User.exists" /> 
<button ng-click="$state.go('base.index', null, {reload: true})" >reload</button> 

Проверьте, что все в action here

Смежные вопросы