angular.module('demoApp', ['ui.router'])
\t .run(function($rootScope, $state) {
$rootScope.$on('$stateChangeError', function(evt, to, toParams, from, fromParams, error) {
if (error.redirectTo) {
$state.go(error.redirectTo);
} else {
$state.go('error', {status: error.status})
}
})
})
\t .factory('userService', userService)
\t .config(routes);
function userService() {
\t var usersMock = {
\t 'testUser': {
\t username: 'testUser',
password: '1234'
},
'testUser2': {
\t username: 'testUser2',
password: '1234'
}
};
\t var userService = {
\t user: undefined,
\t login: function(userCredentials) {
\t // later --> $http.post('auth', userCredentials).then(...)
// for demo use local data
var user = usersMock[userCredentials.username]
userService.user = (user && (user.password == userCredentials.password)) ?
\t user : undefined;
return user;
},
logout: function() {
\t userService.user = undefined;
}
}
return userService;
}
function routes($urlRouterProvider, $stateProvider) {
\t $urlRouterProvider.otherwise('/');
$stateProvider
\t .state('root', {
\t url: '',
\t abstract:true,
resolve: {
\t 'user': function(userService) {
\t return userService.user; // would be async in a real app
}
},
views: {
\t '': {
\t templateUrl: 'layout.html',
},
\t '[email protected]': {
\t template: '<h1>header View<span ng-if="user"><button ng-click="logout()">logout</button></span><span ng-if="!user"><button ng-click="login()">login</button></span></h1>',
controller: function($scope, $state, user, userService) {
\t $scope.user = user;
$scope.login = function() {
\t $state.go('login');
};
$scope.logout = function() {
\t userService.logout();
$state.go('root.home', {}, {reload: true});
};
}
\t },
'[email protected]': {
template: '<p>footer view</p>'
}
}
})
\t .state('root.home', {
url: '/',
views: {
'content': {
template: 'Hello at home'
}
}
})
.state('root.about', {
url: '/about',
views: {
'content': {
template: 'about view'
}
}
\t })
.state('root.restricted', {
url: '/restricted',
resolve: {
\t auth: function(userService, $q, $timeout) {
\t var deferred = $q.defer();
\t /* //with an async
return UserService.load().then(function(user){
if (permissionService.can(user, {goTo: state})) {
return deferred.resolve({});
} else {
return deferred.reject({redirectTo: 'some_other_state'});
}
}*/
$timeout(function() {
if (angular.isUndefined(userService.user)) {
return deferred.reject({redirectTo: 'login'});
}
else {
return deferred.resolve(userService.user);
}
});
return deferred.promise;
}
},
views: {
'content': {
template: 'this is only visible after login. Hello {{user}}!',
controller: function($scope, auth) {
\t $scope.user = auth.username;
}
}
}
\t })
.state('login', {
url: '/login',
templateUrl: 'views/login.html',
controller: function($scope, $state, userService) {
\t $scope.login = function(cred) {
\t var user = userService.login(cred);
if (angular.isUndefined(user)) {
\t alert('username or password incorrect.')
}
else {
\t $state.go('root.restricted');
}
};
}
});
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.18/angular-ui-router.js"></script>
<div ng-app="demoApp">
<a ui-sref="root.home" href="#">home</a>
<a ui-sref="root.about" href="#">about</a>
<a ui-sref="root.restricted" href="#">restricted page</a>
<div ui-view>
</div>
<script type="text/ng-template" id="views/login.html">
\t <h1>Login</h1>
<p>Try testUser and 1234 as credentials</p>
<label>Username</label><input ng-model="userCred.username"/>
<label>Password</label><input type="password" ng-model="userCred.password"/>
<button ng-click="login(userCred)">login</button>
</script>
<script type="text/ng-template" id="layout.html">
\t <div>
<div ui-view="header"></div>
<div ui-view="content"></div>
<div ui-view="footer"></div>
\t </div>
</script>
</div>
迅速な対応をありがとうございます。これを試してみましょう。 – user3504187
ありがとう、私はUIを修正することができました。 – user3504187
このコードは何をしていますか?
.run(function($rootScope, $state) { $rootScope.$on('$stateChangeError', function(evt, to,toParams, from, fromParams, error) { if (error.redirectTo) { $state.go(error.redirectTo); } else { $state.go('error', {status: error.status}) } })
– user3504187