각도가 새 것이므로 아마도 완전히 잘못되었습니다./sites 컨트롤러 페이지에서 verifyAuth.getUserSiteAccess()에 액세스하여 사이트 목록을 반환하고 뷰에 대한 html 링크를 작성하려고합니다.
userSites에 로그인하면 var 인증이 없으므로 Google 인증 모듈을 사용하고 있습니다. 그러면 Google에 ping을 보내고 /api/index.php/login을 호출하여 사용자 사이트 목록을 반환 한 다음이 경우 완료합니다. $ q.defer(). resolve (true);와 함께. 문제는 사이트 컨트롤러 기능이 정의되기 전에 userSites에 액세스하려고하는 것입니다. $ q.defer() 후에 $ scope.test()를 호출 할 수있는 방법이 있습니까? 또는 이것을 할 수있는 더 좋은 방법이 있습니까?
setTimeout ($ scope.test, 500)을 실행하면 정상적으로 작동합니다.
경로 -> 사용자 액세스 토큰 확인, 정의되지 않은 경우 userSites로드 -> 섹션 액세스 확인 -> 완료 연기.
'use strict';
angular.module('mps', [
'ngRoute',
'angularOauth',
'googleOauth',
'mps.global',
'mps.home',
'mps.sites',
'mps.site'
]).
config(['$routeProvider', function($routeProvider) {
$routeProvider.when('/', {
templateUrl: 'views/home/index.html',
controller: 'home',
resolve: {
auth: function(verifyAuth) {
verifyAuth.verifyUserAccess(true);
}
}
});
$routeProvider.when('/sites', {
templateUrl: 'views/sites/index.html',
controller: 'sites',
resolve: {
auth: function(verifyAuth) {
console.log('sites route selected');
verifyAuth.verifyUserAccess(false);
}
}
});
...
.factory('verifyAuth', ['$rootScope', '$window', '$q', '$location', '$timeout', '$http', 'Token',
function($rootScope, $window, $q, $location, $timeout, $http, Token) {
var userSites = null;
return {
deferLocation: function(isToken, index) {
var deferred = $q.defer();
var _location = $location;
if(isToken) {
switch(index) {
case true:
// Homepage/site toggling.
deferred.reject();
_location.path('/sites');
_location.replace();
break;
default:
// All pages.
deferred.resolve(true);
break;
}
} else {
// No token, redirect to login screen.
this.userError();
}
},
verifySectionAccess: function(userSites, siteName, index) {
if(siteName) {
// Subpage, verify section.
for(var i in userSites.sites) {
if(userSites.sites[i].sitename === siteName) {
this.deferLocation(true, index);
return false;
}
}
} else {
// Sites page.
this.deferLocation(true, index);
return false;
}
// No access to section.
this.userError();
return false;
},
// Check user permission are set.
verifyUserAccess: function (index, siteName) {
var token = Token.get();
var _this = this;
if(token) {
if(userSites) {
// Verify user section access.
_this.verifySectionAccess(userSites, siteName, index);
} else {
// Use google token to get user email and load site permissions.
Token.verifyAsync(token).
then(function(data) {
$http({method: 'GET', async: false, url: '/api/index.php/login/' + data.email}).success(function(d) {
userSites = d;
// Verify user access to specific section.
_this.verifySectionAccess(userSites, siteName, index);
});
}, function(error) {
_this.userError();
return false;
}
);
}
} else {
this.deferLocation(false, index);
}
},
getUserSiteAccess: function() {
console.log(userSites);
return userSites;
}
피드백을 주셔서 감사합니다. 나는 이것을 다음과 같이 갱신했고 console.log ('then 1') ..2.3을 실행했다. 그러나 view/controller는 여전히 반환 전에 deferred.promise를 렌더링하고있다. http://jsfiddle.net/qkLkdx2u/ – user1572796
이것은 드롭 인 코드가 아니 었습니다. 이것은 높은 수준의 예였습니다. 그것은 단지 "효과가 없을 것"입니다. 사용자가 확인 될 때까지 경로 전환을 지연하려면 약속을 일부 'resolve'매개 변수로 반환해야합니다. –
그래, 내가 뭔가있는 줄 알았다. 마침내 그것을 귀하의 예제를 기반으로 알아 냈어, 다시 한번 감사드립니다. – user1572796