ng-repeat渲染完成事件
此方法与前篇所写不同的是, 此种写法, 每次repeat数组有更新变化(需要重新渲染)时, 都会触发此事件, 调用对应侦听, 但是, Angularjs1.3.0及其以上的版本不支持此种写法.
核心代码
原理是使用自定义一个过滤器, 具体代码如下:
myApp.filter('ngRepeatFinishEveryTime', function ($timeout) { return function (data, eventName) { var me = this; var flagProperty = '__finishedRendering__'; if (!data) data = {}; if (!data[flagProperty]) { Object.defineProperty(data, flagProperty, { enumerable: false, configurable: true, writable: false, value: {} }); $timeout(function () { delete data[flagProperty]; me.$emit(eventName ? eventName : "ngRepeatFinishEveryTime"); }, 0, false); } return data; }; });
实例
下面是具体用法实例:
<!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8"> <style> .container { width: 600px; margin: auto; } .container > div { padding: 15px; background-color: #6D6D6D; color: #ffffff; } table { width: 100%; border: none; border-padding: 0; border-spacing: 0; } table thead{background-color: #c9e4ec;} table td { text-align: center; } table td .button { cursor: pointer; color: #571d00; font-weight: bold; } table tr { height: 2.5em; vertical-align: middle;} table tbody tr:nth-child(2n+1) { background-color: #f0f0f0; } table tbody tr:nth-child(2n) { background-color: #f0e0ff; } table tfoot { background-color: #ffd9c2; } </style> <title></title> <script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="http://apps.bdimg.com/libs/angular.js/1.2.9/angular.min.js"></script> </head> <body ng-app="myApp" ng-controller="userCtrl"> <div class="container"> <table> <thead> <tr> <th>索引</th> <th>学号</th> <th>姓名</th> <th>性别</th> <th>年龄</th> <th>操作</th> </tr> </thead> <tbody repeat-id="r0"> <tr ng-repeat="(si,stu) in students=(persons|orderBy:'sort')|ngRepeatFinishEveryTime:'studentsRepeatFinish' track by $index"> <td ng-bind="si+1"></td> <td ng-bind="stu.id"></td> <td ng-bind="stu.name"></td> <td ng-bind="stu.gender"></td> <td ng-bind="stu.age"></td> <td> <span class="button" ng-click="changeSort(students, si, -1, 'sort')" ng-if="!$first">上移</span> <span class="split" ng-if="!$first&&!$last"></span> <span class="button" ng-click="changeSort(students, si, 1, 'sort')" ng-if="!$last">下移</span> </td> </tr> </tbody> <tfoot> <tr> <td colspan="6">总数量: <span ng-bind="persons.length"></span></td> </tr> </tfoot> </table> <div> <p> <lable>姓名: <input ng-model="newStu.name" type="text"/></lable> </p> <p> <lable>性别: <input ng-model="newStu.gender" type="radio" name="gender" value="男"/>男 <input ng-model="newStu.gender" type="radio" name="gender" value="女"/>女 </lable> </p> <p> <lable>年龄: <input ng-model="newStu.age" type="number"/></lable> </p> <button ng-click="add(newStu)">添加</button> </div> </div> <script> var myApp = angular.module('myApp', []); myApp.filter('ngRepeatFinishEveryTime', function ($timeout) { return function (data, eventName) { var me = this; var flagProperty = '__finishedRendering__'; if (!data) data = {}; if (!data[flagProperty]) { Object.defineProperty(data, flagProperty, { enumerable: false, configurable: true, writable: false, value: {} }); $timeout(function () { delete data[flagProperty]; me.$emit(eventName ? eventName : "ngRepeatFinishEveryTime"); }, 0, false); } return data; }; }); myApp.controller('userCtrl', function ($scope) { $scope.newStu = { name: "jicemoon", gender: "男", age: 19 } $scope.persons = [{ id: "161112001", sort: 0, name: "赵子龙", gender: "男", age: 18 }, { id: "161112002", sort: 2, name: "吕布", gender: "男", age: 18 }, { id: "161112003", sort: 1, name: "貂蝉", gender: "女", age: 18 }, { id: "161112004", sort: 3, name: "孙尚香", gender: "女", age: 18 }]; $scope.add = function (obj) { obj = JSON.parse(JSON.stringify(obj)); var lens = $scope.persons.length + 1; obj.id = "161112" + ("000" + lens).substring(('' + lens).length); obj.sort = lens - 1; $scope.persons.push(obj); } $scope.changeSort = function (arr, index, up, attr) { var temp; temp = arr[index].sort; arr[index][attr] = arr[index + up][attr]; arr[index + up][attr] = temp; return false; }; $scope.$on("studentsRepeatFinish", function (repeatFinishedEvent) { console.log("data update & repeat render complete"); }) }) </script> </body></html>
完整实例, 请点击一下链接进行下载
链接: http://pan.baidu.com/s/1c7eRRg 密码: 34gp
作者:jicemoon
链接:https://www.jianshu.com/p/8d3269f78a1c
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦