我花了一天的时间才使它正常工作,所以我认为我的经验可能对某些人有用。也许其他一些人会找到改进。
所以我两天前开始使用AngularJS。我想让它与Google Cloud Endpoints一起工作,创建一个后端接口。这对我来说是个麻烦。
gapi的JavaScript客户端带有异步加载,因此在gapi未定义时,Angular初始化将崩溃。
所以您需要在gapi初始化时引导Angular:
- 删除ng-app="myApp"
- 添加
<script src="https://apis.google.com/js/client.js?onload=googleOnLoadCallback"></script>
添加回调函数:
function googleOnLoadCallback(){ var apisToLoad = 1; // must match number of calls to gapi.client.load() var gCallback = function() { if (--apisToLoad == 0) { //Manual bootstraping of the application var $injector = angular.bootstrap(document, ['myApp']); console.log('Angular bootstrap complete ' + gapi); }; }; gapi.client.load('helloWorld', 'v1', gCallback, '//' + window.location.host + '/_ah/api'); }
感觉很好,不过打个电话怎么样?
所以这是控制器:
angular.module('myApp.controllers', []).
.controller('MyCtrl', ['$scope' ,'helloWorldService',
function($scope,greetingsService) {
helloWorldService.loadData($scope);
}]);
这里是服务:
angular.module('myApp.services', [])
service('helloWorldService', [function() {
this.loadData = function($scope) {
//Async call to google service
gapi.client.helloWorld.greetings.listGreeting().execute(
function(resp) {
if (!resp.code) {
console.debug(resp);
$scope.greetings = resp.items;
// Because it's a callback,
// we need to notify angular of the data refresh...
$scope.$apply();
}
});
};
}]);
通过 Angular,您的页面可以神奇地更新。
请随意指出我犯错的地方。
$scope.$digest
,因为它仅在当前的$scope
对象上启动一个脏检查循环;而$scope.$apply
更加昂贵,因为它会启动整个应用程序的脏检查循环。 - hyang123