我正在使用带有ng-repeat指令的AngularJS
我真的需要知道是否有办法绑定诸如' ng-repeat-before-render'之类的事件。并且' ng-repeat-after-render'。我需要它有几个原因,其中之一是为了计算渲染前后的高度
我看到几个依赖于$scope.$last
的指令,但$scope.$last
只有在按顺序呈现最后一个元素时才是真的,在我的情况下,我在列表中间添加元素。
我真的很感谢解决这个问题的方向。
答案 0 :(得分:1)
在渲染之前使用$ evalAsyc,在渲染之后使用$ timeout:
link: function(scope, element,attr){
scope.$evalAsync(function(){
// executes after compile/link
// and before render
})
$timeout(function(){
// executes after render
})
})
答案 1 :(得分:0)
不幸的是,ngRepeat并没有提供您所要求的内容。 ngRepeatStart / End只是序列开始/结束的标记,而不是呈现开始/结束的位置。 (它用于制作集合中某些行的页眉/页脚,或者可能是简单的分页。)
渲染的真正问题在于,当你在Angular中时,你永远不知道你在渲染链中的实际位置。像你想要的那样的指令很难/甚至不可能创建。当Angular开始渲染时,它会开始#34; walk" DOM,查看每个项目/孩子和"编译"这些元素。任何时候,翻译操作都可以使其开始一个全新的序列。您可以通过自定义元素类型指令看到这一点。
Angular最终会在两次传递中执行此操作:编译和链接。直到你进入链接阶段,你甚至可以梦想计算一个项目的高度,因为实际上将对象添加到DOM的位置。但是在这个阶段,你仍然在主线程上(JS只有一个),所以浏览器可能还没有机会计算它!
我的建议是改变战术。使用某种去抖和setImmediate工具让处理循环完成它正在做的事情,然后执行那时所需的任何尺寸检查更新。您可以使用简单的指令轻松检测元素何时需要完成 - 任何具有ANY链接功能的指令都将在呈现项目时调用。
所以我的建议是:
这应该是高效的,它应该有效,而且非常简单。