javascript - angularjs 子指令 DOM 加载速度不够快

标签 javascript angularjs angularjs-directive angularjs-compile

您好,我有嵌套指令,其中我有一个父指令及其可以被嵌入的子指令。我的问题是,当尝试在父链接函数中查找一些 dom 元素时,除非我设置超时,否则它不会返回数组。看起来子渲染/嵌入的速度不够快。那么有没有一种方法可以在不使用超时然后调用查找子元素的情况下解决这个问题?

var app = angular.module('plunker', [])
.run(function($templateCache){
  $templateCache.put('innerPane.html', "<div class='inner-pane' ng-transclude></div>");

  $templateCache.put('slidePaneSelector.html', "<div class='slide-pane'><inner-pane><h2>First Inner Pane</h2></inner-pane><inner-pane><h2>Second Inner Pane</h2></inner-pane></div>");
})
.directive('innerPane', function(){
	return {
		restrict: 'EA',
		transclude: true,
		replace: true,
		templateUrl: 'innerPane.html',
		scope:{},
		link: function(scope,element,attr){

		}
	}
})
.directive('slidePaneSelector', ['$timeout',function($timeout){
	return {
		restrict: 'EA',
		transclude: true,
		replace: true,
		templateUrl: 'slidePaneSelector.html',
		scope:{},
		link: function(scope,element,attr){

			var firstPaneElement = angular.element(element.find('div')[0]);
			var secondPaneElement = angular.element(element.find('div')[1]);
			
			console.log(element.find('div'));		

      $timeout(function(){
          console.log(element.find('div'));
      },100);
		
		}
	}
}]);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.22/angular.min.js"></script>
<!DOCTYPE html>
<html ng-app="plunker">

  <head>
    <meta charset="utf-8" />
    <title>AngularJS Plunker</title>
    <script>document.write('<base href="' + document.location + '" />');</script>
    <link rel="stylesheet" href="style.css" />
    <script data-require="angular.js@1.2.x" src="https://code.angularjs.org/1.2.28/angular.js" data-semver="1.2.28"></script>
    <script src="app.js"></script>
  </head>

  <body ng-controller="MainCtrl">
    <p>Hello {{name}}!</p>
    
    <slide-pane-selector></slide-pane-selector>
  </body>

</html>

笨蛋: http://plnkr.co/edit/sS5cSMboSV2mjlRxsgO8?p=preview

最佳答案

您可以使用不带时间组件的 $timeout - 它会等待 $digest 周期结束并执行。

我认为正确的方法是让子指令向父指令“注册”。这是通过 require: "^parent" 并在父 Controller 上公开一些 register 方法来完成的。

.directive("parent", function(){
  return {
    controller: function($scope, $element){
       this.registerChild = function(childElement){
          // do whatever you need here
       }
    }
  }
}

.directive("child", function(){
  return {
    require: "^parent",
    link: function(scope, element, attrs, parentCtrl){
       parentCtrl.registerChild(element);
    }
  }
}

关于javascript - angularjs 子指令 DOM 加载速度不够快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28208721/

相关文章:

javascript - 从 2 个不同的属性获取 MySql 表中的项目

javascript - 需要根据 Angular js应用程序中的索引重新排序对象列表

javascript - Angular Directive(指令) Controller : Argument is not a function, 未定义

javascript - 如何在 Angular http请求的错误和成功回调之间共享变量

javascript - 如何使用名称中的其他变量值创建javascript变量

javascript - Redis 使用 sync/await 关键字

javascript - 您使用哪种 JavaScript BDD 框架?

javascript - 从angularjs中下一页上单击元素的 Controller 获取值

javascript - Angular 指令模板和子指令包含

javascript - 如何定义多个相似的指令?