angularjs – Angular JS viewContentLoaded在初始主页载入上加载两次

前端之家收集整理的这篇文章主要介绍了angularjs – Angular JS viewContentLoaded在初始主页载入上加载两次前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我注意到,在我的初始首页加载中,我的viewContentLoaded正在触发两次,为什么呢?
  1. app.run(function
  2. ($rootScope,$log) {
  3. 'use strict';
  4. $rootScope.$state = $state;
  5. $log.warn("gets here");
  6.  
  7. $rootScope.$on('$viewContentLoaded',function(){
  8. $log.warn("gets here2");
  9. });
  10. });

输出页面加载

  1. "gets here"
  2. "gets here2"
  3. "gets here2"

而我的路由如下

  1. $urlRouterProvider.when('','/');
  2.  
  3. // For any unmatched url,send to 404
  4. $urlRouterProvider.otherwise('/404');
  5.  
  6. $stateProvider
  7. .state('home',{
  8. url: '/',templateUrl: 'views/search.html',controller: 'SearchCtrl'
  9. })

我的Index.html

  1. <div id="canvas">
  2. <ng-include src="'views/partials/header.html'"></ng-include>
  3. <!-- container -->
  4. <div ui-view ></div>
  5. <!-- /container -->
  6. <ng-include src="'views/partials/footer.html'"></ng-include>
  7. </div>
它只是uiView指令实现的细节.它在初始化(链接)阶段触发$viewContentLoaded事件.在这一点上,还没有一个国家知道,但事件仍然被解雇.

然后,一旦$状态服务实际解决您的本地状态,事件再次被触发,转换到它,加载模板等.

所以总结一下,它不是因为错误的配置,也不是您的模板加载两次.这只是uiView的工作原理.

您甚至可以通过完全注释掉您的状态定义和大部分index.html内容(ui-view本身除外)来进行验证. $viewContentLoaded仍将被触发一次.

代码摘录:

uiView指令声明:

  1. {
  2. restrict: 'ECA',terminal: true,priority: 400,transclude: 'element',compile: function (tElement,tAttrs,$transclude) {
  3. return function (scope,$element,attrs) {
  4. ...
  5. updateView(true);
  6. ...
  7. }
  8. }
  9. }

和updateView函数

  1. function updateView(firstTime) {
  2. ...
  3. currentScope.$emit('$viewContentLoaded');
  4. currentScope.$eval(onloadExp);
  5. }

有关更多信息,请参阅GitHub – viewDirective.js上的完整源代码

猜你在找的Angularjs相关文章