我有一个抽象的基本模板,可根据用户类型加载导航。这部分适用于初始加载。问题是用户登录或注销后无法重新加载父templateProvider。我在这里尝试了重新加载父模板的解决方案,但是导航模板不受影响。有没有一种方法可以重新加载templateProvider,或者这样做的更好的方法?理想情况下,我不必将导航提供商添加到每个子路线。
路线:
$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问题发出的控制器功能:
scope.login_submit = function(e){ e.preventDefault(); User.login(scope.login, function(res){ $state.transitionTo( 'base.dashboard', null, {reload: true, inherit: true, notify: true } ); }); };
我在这里创建了工作示例。
这将是调整后的状态def:
.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' ,基于URL从服务器获取html模板。
'$templateRequest'
这些是控制器和服务
.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>
在这里检查所有动作