【发布时间】:2013-12-07 11:29:17
【问题描述】:
我正在使用 AngularJS 和 Google Cloudendpoint 构建网站
架构如下。我有:
1 - 管理整个站点显示(顶部菜单、模式等...)的 MainCtrl
<body ng-controller="MainCtrl" ng-cloak main-directive>
...
<div ng-view></div>
...
</body>
2 - 每个页面都有一个控制器的 ng-view,每个页面都有自己的控制器,由 $routeprovider 管理
main.js
.config([
'$routeProvider',
'$locationProvider',
'$httpProvider',
function($routeProvider, $locationProvider, $httpProvider) {
...
$routeProvider.when('/example', {
templateUrl : 'partials/example.html',
controller : 'ExampleCtrl',
access : accessLevels.PUBLIC
}
...
$routeProvider.otherwise({redirectTo: '/'});
}
MainCtrl 需要对 Google Cloud Endpoint 进行异步调用才能使会话看起来像这样。
gapi.client.myapi.app.init().execute(function(resp){});
到目前为止,我所做的是将代码包装在 MainCtrl 调用的 Service 函数中,然后在每个子控制器中监视 initDone 值,该值在异步调用完成时在 MainCtrl 中更新。
主控件
SessionService.init().then(function(data){
$scope.initDone = SessionService.getInitDone();
});
服务
angular.module('myapp.services').service('SessionService', function ($http, $q, $rootScope) {
this.initDone = false
this.session = {}
this.init = function(){
var s = this;
var deferred = $q.defer();
gapi.client.myapi.app.init().execute(function(resp){
deferred.resolve(resp);
s.initDone = true;
});
return deferred.promise;
}
this.getInitDone = function(){
return this.initDone;
}
});
ExampleCtrl
angular.module('myapp.controllers').controller('ExampleCtrl', function MainCtrl($scope, $timeout, $log, $location, SessionService) {
$scope.$watch('initDone', function(newVal, oldVal){
$scope.testValue = SessionService.getInitDone()
})
});
虽然这项工作我不确定它是否是正确的解决方案。我希望能够让 ng-view 等到 MainCtrl 完成他的工作。
因为按照我的方式进行操作意味着一旦对端点的调用得到更新,从用户的角度来看这看起来不太好,就会显示 ng-view。
我尝试在 $routeProvider 中使用 resolve 并从那里进行 API 调用,但是我的 MainCtrl 没有正确获取会话值。
我的解决方案是:
$routeProvider.when('/example', {
templateUrl : 'partials/example.html',
controller : 'ExampleCtrl',
access : accessLevels.PUBLIC,
resolve : MainCtrl.init
}
但 MainCtrl 在 $routeProvider 中不可用
另一个想法是拦截 ng-view 调用,但我不确定在哪里执行此操作并同时访问 Service。
感谢您的任何想法/帮助
编辑
我试图在我的 main.js 中做这样的事情
$routeProvider.when('/example', {
templateUrl : 'partials/example.html',
controller : 'ExampleCtrl',
access : accessLevels.PUBLIC,
resolve: {
sessionData: ["$q", "SessionService", function($q, SessionService) {
//console.log(SessionService.getTest())
var deferred = $q.defer();
gapi.client.myapi.app.init().execute(function(resp){
deferred.resolve(resp);
});
return deferred.promise;
}]
});
如果我希望每个子控制器调用 api,这会起作用。不过,我想要的是让子控制器使用 MainCtrl 准备就绪后初始化的任何内容。基本上只在 MainCtrl 准备好时才加载视图和关联的控制器(包括异步调用
【问题讨论】:
标签: angularjs google-cloud-endpoints