Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 渲染后重复angularjs ng_Javascript_Angularjs_Angularjs Directive_Angularjs Ng Repeat - Fatal编程技术网

Javascript 渲染后重复angularjs ng

Javascript 渲染后重复angularjs ng,javascript,angularjs,angularjs-directive,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Directive,Angularjs Ng Repeat,我正在使用AngularJS和ng repeat指令。 我真的需要知道是否有一种方法可以绑定诸如“渲染前ng repeat”和“渲染后ng repeat”之类的事件。我需要它有几个原因,其中之一是为了计算渲染前后的高度。 我看到了一些依赖于 $范围的指令。$$< /Cord>,但是 $Simult.EXTRON/仅在顺序呈现最后一个元素时才是真的,在我的情况下,我在列表中间添加元素。p> 我真的很感激有一个方向来解决这个问题。渲染前使用$evalAsyc,渲染后使用$timeout: link:

我正在使用AngularJS和ng repeat指令。
我真的需要知道是否有一种方法可以绑定诸如“渲染前ng repeat”和“渲染后ng repeat”之类的事件。我需要它有几个原因,其中之一是为了计算渲染前后的高度。
我看到了一些依赖于<代码> $范围的指令。$$< /Cord>,但是 $Simult.EXTRON/<代码>仅在顺序呈现最后一个元素时才是真的,在我的情况下,我在列表中间添加元素。p>
我真的很感激有一个方向来解决这个问题。

渲染前使用$evalAsyc,渲染后使用$timeout:

link: function(scope, element,attr){
        scope.$evalAsync(function(){
               // executes after compile/link
               // and before render
        })
        $timeout(function(){
               // executes after render
        })
})

不幸的是,ngRepeat不能提供您所要求的。ngRepeatStart/End只是序列开始/结束的标记,而不是渲染开始/结束的标记。(它用于从集合中的某些行生成页眉/页脚,或者进行简单的分页。)

渲染的真正问题是,当处于角度渲染时,您永远不知道自己在渲染链中的实际位置。像您想要的那样的指令甚至很难/不可能创建。当Angular开始渲染时,它开始“漫游”DOM,查看每个项/子项,并在执行过程中“编译”这些元素。在任何时候,转换操作都可以使它开始一个全新的序列。在自定义元素类型指令中经常可以看到这一点

Angular最终在两个过程中完成此操作:编译和链接。直到到达链接阶段,您才可能梦想计算一个项目的高度,因为这是对象实际添加到DOM的地方。但是在这个阶段,您仍然处于主线程(JS只有一个线程),因此浏览器可能还没有机会计算它

我的建议是改变策略。使用某种去盎司和工具让处理循环完成它正在做的事情,然后在那一点上执行所需的任何大小检查更新。您可以很容易地通过一个简单的指令来检测一个元素何时需要这样做——任何带有任何链接函数的指令都会在呈现项时调用它

因此,我的建议是:

  • 使用简单的链接函数编写“iwasdraw”指令
  • 在这个链接函数中,用一个去盎司键调用一个“去盎司”或“setImmediate”函数——选择你的选项,有几十个
  • 在该回调中,进行大小计算

  • 这应该是有效的、可行的,而且非常简单。

    要求是什么。。也许你真的不需要在之前和之后render@HarishR我有一个项目列表和一个滚动条(使用jquery完美滚动条)。在列表中向上滚动会加载更多项目(向上滚动,而不是像人们过去那样向下滚动)。呈现消息后,我更新滚动条。问题是滚动条仍然位于列表的顶部,而不是移动到中间。这个问题可以在没有ngRepeat事件的情况下解决,但我真的很想知道ngRepeat提供了哪些选项,以便在渲染后执行操作。请参阅pre/post链接函数:您有ng repeat start和ng repeat end,您可以在其中连接things@HarishR我如何使用它?您可以添加一个示例吗?链接功能针对中继器中的每个项目执行。我正在寻找单身之前和单身之后。如果我有20个元素,这些方法将运行20次。在ng repeat之外创建父指令。在angular中,没有显式的渲染前和渲染后事件。但是$evalAsync和$timeout将完成同样的事情$evalAsync实际上是一个非常好的答案。只是它不能解决请求的“仅一次”部分。但你可以通过一个简单的去盎司机制来实现这一点,你就到家了…@ChadRobinson“只是它不能解决唯一的时间部分”这句话是什么意思?指令中有
    $evalAsync
    ,因此它将为你的ngRepeat中的每个条目运行一次。在你的OP中,你要求一个只执行一次的解决方案。我考虑过使用去盎司,甚至做到了。这种解决方案的问题是找到去盎司函数的精确时间。更少的时间将导致错误的回调执行。更多的时间会导致ui跳转。看一看,一个插件可以帮助解决这个问题。这是一个超快的回调,你可以将它与clearImmediate进行配对,以解除Bounce(clearImmediate后跟setImmediate将清除以前但尚未执行的调用,然后让你设置最后一个调用)。这是一个哲学上的区别。AngularJS建立在这样一个原则上,即过分关注直接DOM操作是低效的——这本身就是一种黑客行为。核心开发人员尽最大努力消除了这样做的必要性。避免使用jQuery与jQuery本身无关,而是需要执行诸如$('.go find my element').doSomethingToIt()之类的操作。你的问题又回到了他们试图逃离的地方,所以黑客攻击可能是不可避免的。