渲染后的angularjs ng-repeat

时间:2014-07-28 11:57:22

标签: javascript angularjs angularjs-directive angularjs-ng-repeat

我正在使用带有ng-repeat指令的AngularJS 我真的需要知道是否有办法绑定诸如' ng-repeat-before-render'之类的事件。并且' ng-repeat-after-render'。我需要它有几个原因,其中之一是为了计算渲染前后的高度 我看到几个依赖于$scope.$last的指令,但$scope.$last只有在按顺序呈现最后一个元素时才是真的,在我的情况下,我在列表中间添加元素。

我真的很感谢解决这个问题的方向。

2 个答案:

答案 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链接功能的指令都将在呈现项目时调用。

所以我的建议是:

  1. 写一个" iWasDrawn"带有简单链接功能的指令。
  2. 在该链接功能中,拨打'去抖动'或者' setImmediate'具有去抖功能 - 选择你的选择,有几十种。
  3. 在该回调中,进行大小计算。
  4. 这应该是高效的,它应该有效,而且非常简单。