angularjs 监听ng-repeat渲染完成

angularjs 监听ng-repeat渲染完成

angularjs 页面是靠绑定数据完成渲染的。而监听渲染数据的完成的需求会经常遇到。下面给出解决方法。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
</head>
<body ng-app="myApp">
<!--将指令添加到迭代的标签内, on-finish-render-filters 注意指令的格式-->
<table ng-controller="myCtrl" border="1">
<tr ng-repeat="(x, y) in myObj" on-finish-render-filters>
  <td>{{x}}</td>
  <td>{{y}}</td>  
</tr>
</table>

<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope) {
  $scope.myObj = {
    "Name" : "Alfreds Futterkiste",
    "Country" : "Germany",
    "City" : "Berlin"
  };
  //$emit用来向父级Scope传送事件(命令),$scope.$on()是监听事件,监听$emit或者$brodercast是否将事件(命令)
  //传送回来,若事件已传送回来,则表示数据已经渲染完毕,就可以执行以后的其他操作了。  
  $scope.$on('ngRepeatFinished', function(ngRepeatFinishedEvent) {
    	alert("1");
		
});
  });
  //定义指令:
app.directive('onFinishRenderFilters', ['$timeout', function ($timeout) {
       return {
           restrict: 'A',
           link: function(scope,element,attr) {
               if (scope.$last === true) {
				scope.$emit('ngRepeatFinished'); 
		
               }
           }
       };
   }]);
	
</script>
</body>
</html>

升级实现:
给指令指定一个处理函数completeRepeat

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
</head>
<body ng-app="myApp">

<table ng-controller="myCtrl" border="1">
<tr ng-repeat="(x, y) in myObj" on-finish-render-filters="completeRepeat()">
  <td>{{x}}</td>
  <td>{{y}}</td>  
</tr>
</table>

<script>
var app = angular.module("myApp", []);
app.controller("myCtrl", function($scope) {
  $scope.myObj = {
    "Name" : "Alfreds Futterkiste",
    "Country" : "Germany",
    "City" : "Berlin"
  };


	$scope.completeRepeat= function(){
    	alert("3");
    	};
    	//页面加载完成监听事件
	$scope.$watch('$viewContentLoaded', function() {  
    	alert("2");
    });
		
});
  app.directive('onFinishRenderFilters', ['$timeout', function ($timeout) {
        return {
            restrict: 'A',
            link: function(scope,element,attr) {
                if (scope.$last === true) {			 
					scope.$eval( attr.onFinishRenderFilters );              	
                }
            }
        };
    }]);

</script>

</body>
</html>

scope.eval方法是专门执行AngularJS表达式的,通过它处理函数得以执行,这样,指令用在不同的地方,可传递不同的处理函数。

发布了137 篇原创文章 · 获赞 123 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/lz20120808/article/details/89067789