Angular,嵌套指令重复,如果父是$ last则传递

时间:2015-06-02 14:33:07

标签: javascript angularjs

我尝试在完成此嵌套重复中的所有重复后触发事件。所以我知道你可以做一个$ last,但我没有办法在内部重复内部告诉它是在父重复中的$ last。所以我有这个

<div>
    <div ng-repeat="filter in filters.filters" repeat-directive-one filter="filter" update-filter="updateFilter">
</div>
</div>

然后在repeat-directive-one里面看起来像

  <div ng-repeat="item in filter.values | limitTo: filter.showMore ? filter.values.length : '5' track by $index" repeat-directive-two value="::item" update-filter="updateFilter" ng-if="!$last"></div>

<div ng-repeat="item in filter.values | limitTo: filter.showMore ? filter.values.length : '5' track by $index" repeat-directive-two value="::item" update-filter="updateFilter" ng-if="$last"checkbox-fix></div>

那么它的作用是,如果它位于该重复的最后一项,它会在checkbox-fix指令上添加以解决问题。但是,如果上部重复有4个项目,则会激发4次,所以我想要达到

的程度
  ng-if="$last && parent.$last"

但该逻辑似乎没有按预期工作。我甚至试图将父节点(布尔值)作为隔离范围attr传递(在重复指令1中)

   <div ng-repeat="filter in filters.filters" repeat-directive-one filter="filter" update-filter="updateFilter" last-property="$last">

但是记录$ scope.lastProperty什么都不返回。所以我想要一种传递某种标志的方法,即父重复是$ last。有没有办法做到这一点?谢谢!

3 个答案:

答案 0 :(得分:0)

你可以尝试这样的东西在外环完成时播放,然后内部的最后一个循环应该开始观看$ last

<div ng-repeat="stuff in stuffs" outer-loop>
    <div ng-repeat="item in items" inner-loop></div>
</div>


angular.module('test').directive('outerLoop', function($rootScope){
    return function(scope, element, attrs) {
        if (scope.$last){
            $rootScope.$broadcast('outerLoopComplete');
        }   
    };
});

angular.module('test').directive('innerLoop', function(){
    return function(scope, element, attrs) {
        var outerLoopComplete = false;

        scope.$on('outerLoopComplete', function(){
            outerLoopComplete;
        });

        if(outerLoopComplete && $last){
            //inner loop complete
        }
    };
});

答案 1 :(得分:0)

https://docs.angularjs.org/api/ng/directive/ngInit

您可以使用ngInit将$ last的值设置为范围变量,您应该能够在隔离范围的情况下直接和间接地从子范围访问此变量。

答案 2 :(得分:-1)

我最终根据@trevor的建议解决了这个问题:

<div ng-repeat="item in filter.values | limitTo: filter.showMore ? filter.values.length : '5' track by $index" repeat-directive-two value="::item" update-filter="updateFilter" checkbox-fix></div>

将复选框固定在重复上(不需要通过ng-if切换2),然后在复选框修复指令中,我确实喜欢这样:

  return {
        restrict: 'A',
        link: function(elem, attr, tr) {
           if(elem.$parent.$parent.$last && elem.$last){
                //fixed!
           }
        }
    };

所以elem。$ last工作得很好,我必须检查一下数据/结构才能意识到我必须做elem。$ parent。$ parent。$ last而不只是1级父级。