Javascript 在角度指令中获得ng重复完成

Javascript 在角度指令中获得ng重复完成,javascript,angularjs,angularjs-directive,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Directive,Angularjs Ng Repeat,在下面的代码中,angular指令“myscroll”如何知道正在创建哪些ng repeat元素 <myscroll> <div ng-repeat="a in arr">{{a}}</div> </myscroll> {{a} 我知道$last事件没有激发到父指令,我如何解决这个问题 myapp.directive("myscroll", function () { return{ restrict: "E

在下面的代码中,angular指令“myscroll”如何知道正在创建哪些ng repeat元素

<myscroll>
     <div ng-repeat="a in arr">{{a}}</div>
</myscroll>

{{a}
我知道$last事件没有激发到父指令,我如何解决这个问题

myapp.directive("myscroll", function () {
    return{
        restrict: "E",
        transclude: true,
        template: "<span class='left'></span><div class='mask' ng-transclude></div><span class='right'></span>",
        link: function (scope, element, attr) {

            scope.$watch("$last",function(){ console.log("ng-repeat rendered") })

        }
    }
})
myapp.directive(“myscroll”,函数(){
返回{
限制:“E”,
是的,
模板:“”,
链接:功能(范围、元素、属性){
作用域。$watch($last),function(){console.log(“ng repeat rendered”)})
}
}
})

一种简单的方法是创建一个名为“repeat done”的新指令,并在“ng repeat”所在的位置使用它。然后,您可以根据需要通知“myscroll”指令(父范围)

<myscroll>
     <div ng-repeat="a in arr" repeat-done>{{a}}</div>
</myscroll>

myapp.directive('repeatDone', [function () {
  return {
    restrict: 'A',
     link: function (scope, element, iAttrs) {

          var parentScope = element.parent().scope();

          if (scope.$last){
               // ng-repeat is completed and you now have access to 'myscroll' scope
               console.log(parentScope);   
          }
        }
      };
    }])

{{a}
myapp.directive('repeatDone',[function(){
返回{
限制:“A”,
链接:功能(范围、要素、iAttrs){
var parentScope=element.parent().scope();
如果(范围$last){
//ng repeat已完成,您现在可以访问“myscroll”范围
console.log(parentScope);
}
}
};
}])

为了防止其他人偶然发现这个问题,我想与大家分享我的解决方案。德鲁兹的回答为我指明了正确的方向,但我采取了更“优雅”的方法

为了给您提供上下文,我需要使用这个带有ng repeat的系统来填充select下拉列表中的选项。ng选项与插件不兼容(顺便说一句,很漂亮的自动完成/搜索下拉插件!),我需要在所有选项完成渲染后初始化插件

HTML:


编辑:在某些情况下,在rootScope上全程检测这些事件可能是有益的。如果是这种情况,可以将
$scope.$parent.$broadcast
替换为
$scope.$emit
,使事件气泡向上而不是向下。

ng repeat为每个重复的元素创建一个新的子范围。仅在该范围上是$last属性。但即使如此,当所有元素都按照我所知道的方式呈现时,也无法真正通知您。您找到解决方案了吗?这曾经有用,但现在不行了!
<select auto-complete ng-model="stuff">
    <option ng-repeat="item in items" value="{{ item.value }}">{{ item.name }}</option>
</select>
// Extension of built-in ngRepeat directive - broadcasts to its parent when it is finished.
// Passes the last element rendered as an event parameter.
app.directive('ngRepeat', function () {
    return {
        restrict: 'A',
        link: function ($scope, $elem, $attrs) {
            if ($scope.$last)
                $scope.$parent.$broadcast('event:repeat-done', $elem);
        }
    };
});

// My directive for working with the Chosen plugin.
app.directive('autoComplete', function () {
    return {
        restrict: 'A',
        link: function ($scope, $elem, $attrs) {
            $scope.$on('event:repeat-done', function () {
                setTimeout(function () {
                    if (!$elem.children(':first-child').is('[disabled]'))
                        $elem.prepend('<option disabled="disabled"></option>');
                    $elem.chosen({ disable_search_threshold: 10, width: '100%' });
                    $elem.trigger('chosen:updated');
                });
            });
        }
    };
});
myapp.directive("myscroll", function () {
    return{
        restrict: "E",
        transclude: true,
        template: "<span class='left'></span><div class='mask' ng-transclude></div><span class='right'></span>",
        link: function (scope, element, attr) {
            scope.$on("event:repeat-done",function(){ console.log("ng-repeat rendered") })
        }
    }
})