init()和window.init()之间有什么区别?

时间:2013-08-30 16:37:31

标签: javascript angularjs google-cloud-endpoints

我已阅读以下方法,其中显示了使用Google Cloud Endpoints后端为AngularJS前端提供支持的方法:

https://cloud.google.com/resources/articles/angularjs-cloud-endpoints-recipe-for-building-modern-web-applications

我不明白的是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())之前,我们不会得到一个循环吗?

2 个答案:

答案 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相同。