我已阅读以下方法,其中显示了使用Google Cloud Endpoints后端为AngularJS前端提供支持的方法:
我不明白的是AngularJS和Cloud Endpoints初始化的附录。相关部分如下:
附录:关于AngularJS +云端点初始化技巧的提示#1: 注意初始化序列
guestbook app在下面加载了三个不同的JS库 序列:
- AngularJS
- 留言簿应用
- Google API客户端,其中包含端点功能
要遵循此顺序,index.html包含以下内容
<script>
标记中的<head>
标记用于加载每个JS库:<script src="js/angular.min.js"></script> <script src="js/guestbook.js"></script> <script src="https://apis.google.com/js/client.js?onload=init"></script>
加载后,第三个库(Google API客户端)调用 初始化函数由'onload'参数指定。在这 case,init()函数是预期和调用的。提示#2:进入 尽可能快地使用AngularJS世界
在初始化序列中,我们使用两个函数:
init() function window.init() function
这个init()函数在guestbook.js中以下列方式定义:
function init() { window.init(); }
如上所示,该函数只调用window.init() 函数(即在全局窗口对象中定义的init()函数) 并没有别的。 window.init()在AngularJS中定义 控制器如下:
$window.init= function() { $scope.$apply($scope.load_guestbook_lib); };
在AngularJS中,全局窗口对象由“$ window”访问 符号是它的包装。这是AngularJS的最佳实践 不要直接访问窗口对象以提高可测试性。
你不想在中执行初始化的原因 第一个init()方法是这样你可以尽可能多地放入代码 在AngularJS世界中,例如控制器,服务和指令。 因此,您可以充分利用AngularJS的全部功能 您的单元测试,集成测试等等。
似乎正在外部javascript文件中定义全局函数init()
。这个init()
函数只调用window.init()
(并且应该在加载后由Google客户端库调用)。但是window.init()不是全局定义的init()
函数吗?因此,在重新定义window.init()
(因此init()
)之前,我们不会得到一个循环吗?
答案 0 :(得分:1)
此示例尝试使用google api init事件并将其传输到AngularJS范围。
何时
<script src="https://apis.google.com/js/client.js?onload=init"></script>
加载它调用全局定义的init函数,后者又调用window对象上定义的init方法。 由于此功能可以访问角度范围,因此可以很好地使用角度
这使得在promises中包装云端点调用变得更加容易
以下是如何让它变得更容易 http://anandsekar.github.io/initialize-google-appengine-and-angularjs/
答案 1 :(得分:0)
guestbook.js定义了一个从您的描述中显示为全局的init函数。该init函数传递给google client.js。那个全局init函数只是在window.init调用(另一个)全局函数。首先加载的角度模块应该通过角度提供的$ window设置window.init。没有循环,client.js调用guestbook.js的init调用angular方法$ window.init,它与window.init相同。