分析被抄送的内容

时间:2015-02-23 15:33:59

标签: angularjs directive angularjs-ng-transclude

我有一个指令,它可以转换一个任意内容,它应该包含一些可以用ngRepeat创建的子节点。在链接或transcludeFn中,我可以访问子模板,而不是完成的DOM。鉴于此,我如何计算,例如每个孩子的.width()总和?

请参阅http://embed.plnkr.co/o492ObrHC65zbCMxIhxu/

1 个答案:

答案 0 :(得分:0)

这是ng-repeatng-if工作的工件 - 他们创建注释,然后$watch为值插入或从DOM中删除元素。

所以,你得到了被转换元素的实际DOM,但它仍然是由ng-if / ng-repeat生成的,它已经在摘要结束时安排了生成周期。

快速解决方案似乎是使用$timeout 0秒。这并不像看起来那么笨拙 - 没有竞争条件的可能性。它所做的就是安排函数在摘要周期结束时运行,确保它会看到ng-repeatng-if所做的更改。

link: function(scope, iElement){

   scope.$watchCollection('items', function () {
      // will not yet have the repeated elements
      console.log("before timeout", iElement.html());
      $timeout(function () {
        // will have all the repeated elements
        console.log("after timeout", iElement.html());
      });
    });
}

plunker

然而,这说明你永远不知道什么是被转换的指令是什么或者可能正在做什么 - 有些可能会在稍后的时间点改变DOM。更好的方法可能是听取DOM的变化并做出反应。