2016-07-30 35 views
1

为了创建自定义组件系统,我在搞AngularJS。我已经提出了一个关于我的组件系统here的问题,所以你可以检查一下,以便理解我的系统应该如何工作(也许它已经改变了一些,但基本的想法保持不变)。AngularJS - 为什么我不能访问链接函数中的子元素?

我试图通过组件指令和ng-include-属性元素寻找一个子元素,但不知何故事情并不正确。

指令

我的指令如下:

.directive("raqComponent", ["ComponentsStyles", 
function(componentsStyles){ 
    return { 
     restrict: "E", 
     scope: { 
      name: "@" 
     }, 
     template: "<div ng-include=\"'/Components/' + name + '.htm'\"></div>", 
     controller: function($scope, $timeout){ 
      componentsStyles.stylesheets.push($scope.name); 

      if(components[$scope.name] !== undefined){ 
       if(components[$scope.name].getData !== undefined){ 
        components[$scope.name].getData($scope); 
       } 
      } 
     }, 
     link: function(scope, elem, attrs){ 
      if(components[scope.name] !== undefined){ 
       if(components[scope.name].link !== undefined){ 
        console.log("Children:", elem.children()); 
        var elemTarget = elem; 
        components[scope.name].link(elemTarget); 
       } 
      } 
     } 
    }; 
}]) 

在这个指令,用于为每个组件,我用NG-include指令,包括我心爱的部件标记。组件在单独的文件中实现以增加模块性。

一旦页面使用的分量,DOM看起来像这样的实际网页上显示:

enter image description here

现在,元素raq-component与属性ng-include一个子元素。此元素具有一个子元素,它是特定组件的自定义标记的根元素。像这样:

<div class="navbar"> 
    <div class="container"> 
     <div class="row"> 
      <div class="col-md-12"> 
       <div class="navbar-items-container"> 
        <div class="navbar-items"> 
         <div ng-repeat="item in items" class="navbar-item"> 
          <p>{{item.name}}</p> 
         </div> 
        </div> 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 

但是,当我尝试访问子元素时,我无法做到这一点。我在打印指令子元素是这样的:

if(components[scope.name].link !== undefined){ 
    console.log("Children:", elem.children()); 
    var elemTarget = elem; 
    components[scope.name].link(elemTarget); 
} 

和孩子是这样的:

enter image description here

除了没有,由于某种原因!但为什么呢?我已经使用了像第一(),最后()和eq(0)等功能的JQuery,但他们没有做任何事情。有什么奇怪的是,我可以看到,虽然使用Javascript孩子不JQuery的:

enter image description here

那么为什么我不能访问链接功能的子元素?

回答

2

链接函数实际上是一个后链接函数,将在子元素被编译和链接时执行。

然而,从角的正式文件:

注意,包含templateUrl指令子元素不会 已编译和链接,因为它们正在等待他们的 模板异步加载和自己的编译和链接 已被暂停,直到发生这种情况。

虽然它没有告诉,该指令ngInclude就像设置templateUrl,其模板请求是异步的。

这意味着调用链接函数时,ngInclude尚未准备好DOM操作。而你无法得到这些孩子的元素。

快速解决方案:

将代码放在$scope.evalAsync,它将指令的DOM操纵后执行。

相关问题