我有一个指令,它可以转换一个任意内容,它应该包含一些可以用ngRepeat创建的子节点。在链接或transcludeFn中,我可以访问子模板,而不是完成的DOM。鉴于此,我如何计算,例如每个孩子的.width()总和?
答案 0 :(得分:0)
这是ng-repeat
和ng-if
工作的工件 - 他们创建注释,然后$watch
为值插入或从DOM中删除元素。
所以,你得到了被转换元素的实际DOM,但它仍然是由ng-if
/ ng-repeat
生成的,它已经在摘要结束时安排了生成周期。
快速解决方案似乎是使用$timeout
0秒。这并不像看起来那么笨拙 - 没有竞争条件的可能性。它所做的就是安排函数在摘要周期结束时运行,确保它会看到ng-repeat
和ng-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());
});
});
}
然而,这说明你永远不知道什么是被转换的指令是什么或者可能正在做什么 - 有些可能会在稍后的时间点改变DOM。更好的方法可能是听取DOM的变化并做出反应。