Javascript ng重复后不更新css

Javascript ng重复后不更新css,javascript,jquery,html,css,angularjs,Javascript,Jquery,Html,Css,Angularjs,我在Angular中更新元素的css时遇到问题。我有一个div,它包含由ng repeat生成的元素。包含这些元素的div有一个设置的高度,并附有ng滚动条指令ng滚动条会在div中创建一个漂亮的滚动条。为此,它创建嵌套的内部div。因此,在本例中,如果嵌套的内部div的高度大于其容器,则会创建一个滚动条,以便您可以滚动元素 因此,假设我在ng repeat列表中添加或删除项目。发生这种情况时,我希望在ng滚动条生成的内部div超过顶层div的高度时,才将其他css添加到顶层div。(内部div

我在Angular中更新元素的css时遇到问题。我有一个
div
,它包含由
ng repeat
生成的元素。包含这些元素的
div
有一个设置的高度,并附有
ng滚动条
指令<当
div
中的元素超过其容器的高度时,code>ng滚动条会在
div
中创建一个漂亮的滚动条。为此,它创建嵌套的内部div。因此,在本例中,如果嵌套的内部div的高度大于其容器,则会创建一个滚动条,以便您可以滚动元素

因此,假设我在
ng repeat
列表中添加或删除项目。发生这种情况时,我希望在
ng滚动条
生成的内部div超过顶层div的高度时,才将其他css添加到顶层div。(内部div的高度是
ng repeat
列表的实际高度,因为它包含
ng repeat
元素)

为此,我创建了两个指令,一个用于广播事件,另一个用于接收事件。广播事件的事件将附加到每个
ng repeat
元素,并在创建或销毁元素时广播。这是为了检查
ng repeat
列表何时发生更改

接收广播的一个连接到顶层
div
容器(包含由
ng scrollbar
生成的div的容器),并对照由
ng scrollbar
生成的内部div检查其高度,如果内部div的高度大于顶层div,则添加一些css

很抱歉,如果这看起来令人困惑,下面是我的代码,并附上注释,希望能更好地解释:

app.directive('gtScrollLb', function () {
  return {
    restrict: 'A',
    link: function (scope, elem, attrs) { //elem is the top level container of the ng-repeat elements
      var scrollDiv = elem.children()[0]; //this is an internal div created by ng-scrollbars
      var anotherScrollDiv = $(scrollDiv).children("#" + $(scrollDiv).attr("id") + "_container"); //another internal div created by ng-scrollbars
      var id = attrs.gtScrollLb;

      scope.$on(id + "-repeat-change",
        function(newVal, oldVal) {
            //check if ng-scrollbar div that now contains the ng-repeat elements
            //has a greater height than the top level container
            if ($(anotherScrollDiv).height() >= elem.height()) {
              elem.css("border-bottom", "1px solid darkgrey");
            } else {
              elem.css("border-bottom", "");
            }
        }
      );
    }
  };
});

app.directive('gtRepeatable', function () {
  return {
    restrict: 'A',
    link: function (scope, elem, attrs) {
      var id = attrs.gtRepeatable;
      scope.$emit(id + "-repeat-change"); //event that item has been added by ng-repeat
      var parent = scope.$parent;
      elem.bind("$destroy",function(){
        parent.$broadcast(id + "-repeat-change");//event that item has been destroyed by ng-repeat
      });
    }
  }
});
问题在于,在再次确定内部容器的高度之前,添加并销毁
ng repeat
元素。因此,激发更改事件时检查的高度实际上是内部容器的旧高度

我需要检查一下新高度。我一直在努力解决这个问题很长一段时间了,任何帮助都将不胜感激

编辑

简言之,我需要在
ng repeat完成并呈现DOM之后执行一个偶数触发或$watch。我在这里遇到的问题之所以发生,是因为在呈现DOM之前触发了事件

编辑2


对于@vittore,他将此标记为重复。如果你真的仔细阅读了我的问题,你会发现你提出的重复问题与我的实际问题无关。这里的
ng滚动条
没有问题<代码>ng滚动条
工作正常。但有必要将其包含在描述中,因为它会影响我解决问题的方式。

有一种方法可以在渲染最后一个循环元素时获取事件。检查此链接:

还有一个确切的问题是:

和重要部分:

  $scope.$on('loopLoaded', function(evt, index) {
    if (index == $scope.me.length-1) {
      $scope.$broadcast('rebuild:me');
    }
  });

为了让它发挥作用,我最终使用了。我必须使用两个,一个用于属性更改,另一个用于子列表更改

mutationobserver应该少用,如果不加检查,它们会减慢你的应用程序的速度,并导致严重的错误。我在执行异步调用时意外导致了一个无限循环


最好只在对DOM进行更改之前将它们连接起来,并让它们在进行更改后自行断开连接。

创建一个可复制的演示problem@charlietfl围绕这个问题的代码需要在JSFIDLE中进行大量的尝试和复制。有什么我可以详细说明的吗?如果我们看不到,或者复制不到,有谁能帮上忙吗?@charlietfl我会看看我能做些什么。但这基本上是我需要做的。我需要在ng repeat完成并且dom更新后触发一个事件。dom更新后是最重要的部分。在items中使用$last可以知道何时到达End。这不是确切的问题。。。。我的滚动条工作正常。请阅读我的原始问题,您会发现这与ng scrollbar出现故障无关。@Graham您是否尝试过我包含的代码片段?它显示了如何在渲染最后一个元素后广播事件,您只需使用
$scope.$收听事件。
文章中的解耦部分可能会起作用。。。但也可能不是。对于我的具体案例,我在每次
ng repeat
创建和销毁时都会触发事件。因此,它基本上与使用
$last
做了相同的事情。我解决了MutationObserver的问题,并且正确地管理它们,只在必须进行更改之前激活它们,然后在进行更改之后让它们自行停用。这不会留下任何开销。这是相对简单的。这不是最好的方法,但是你不能在$timeout之后检查高度吗?@John,当然可以,并且冒着css加载延迟的风险,因此它似乎对用户有延迟。或者冒着过早检查的风险,css根本无法加载。如果您像我在这里描述的那样正确地管理它们,那么mutationobserver是非常好的$在我看来,超时是开发人员的懒惰。