前端在做數據渲染的時候經常會遇到在數據渲染完畢後執行某些操作,這幾天就一直遇到在列表和表格渲染完畢後,執行點擊和選擇操作。對於angularjs處理這類問題,最好的方式就是指令 directive。 首先,定義指令: 其次,指令定義完畢後,需要將指令添加到迭代的標簽內,此處是<tr>標簽 最後,在最 ...
前端在做數據渲染的時候經常會遇到在數據渲染完畢後執行某些操作,這幾天就一直遇到在列表和表格渲染完畢後,執行點擊和選擇操作。對於angularjs處理這類問題,最好的方式就是指令 directive。
首先,定義指令:
app.directive('onfinishrenderfilters', function ($timeout) { return { restrict: 'A', link: function (scope, element, attr) { if (scope.$last === true) { //判斷是否是最後一條數據 $timeout(function () { scope.$emit('ngRepeatFinished'); //向父級scope傳送ngRepeatFinished命令 }); } } }; });
其次,指令定義完畢後,需要將指令添加到迭代的標簽內,此處是<tr>標簽
<div class="fixed-table-container" style="margin-right: 0px;"> <table class="table table-hover lamp-table"> <thead> <tr> <th></th> <th style="text-align: center; " data-field="name_device-id" tabindex="0" ng-repeat="i in provider.geoZoneListHead track by $index" ng-hide=i.bol> <div class="th-inner sortable " style="padding-right: 10px">{{i.name}} </div> <div class="fht-cell" style="width: 101px;"></div> </th> </tr> </thead> <tbody> <tr ng-repeat="i in provider.geoZoneList" onfinishrenderfilters> <td><input data-index="0" name="btSelectItem" type="radio" value="{{$index}}" ng-click="selectInput($index)"></td> <td class="nameId0">{{$index+1}}</td> <td class="nameId1">{{i.geoZoneName}}</td> <td class="nameId2">{{i.description}}</td> <td class="nameId3">{{i.totalNumberOfMembers}}</td> <td class="nameId4">{{i.country}}</td> <td class="nameId5">{{i.lastUpdateDate}}</td> </tr> </tbody> </table> </div>
最後,在最後一條數據渲染完畢後,$emit用來向父級Scope傳送事件(命令),$brodercast是向子級scope傳送事件(命令)。而$scope.$on()是監聽事件,監聽$emit或者$brodercast是否將事件(命令)傳送回來,若事件已傳送回來,則表示數據已經渲染完畢,就可以執行以後的其他操作了。
$scope.$on('ngRepeatFinished', function (ngRepeatFinishedEvent) { var btnList = $("input[name='btSelectItem']"); btnList.eq(0).attr("checked","checked"); $scope.provider.detalOutlet(); });
在沒有angularJs的時候一般通過監聽onLoad事件來確定頁面是否載入完成。但在使用angularJs來渲染頁面時,onLoad事件不能保證angularJs是否完成了對頁面的渲染。最常見的情況就是用angularJs來載入某個數據Table時,我們得等這個Table載入完之後對Table上的數據進行操作,但因為這個Table是由AngularJs渲染的,所以得找到某個方法獲得AngularJs渲染完畢後的事件。 這也就是為什麼onload事件在angularJs框架上數據刷新不執行的一個原因,因為angularJs是數據驅動,根據數據的更新進行頁面的刷新,而整體頁面已經載入完成(數據更新,angularJs數據渲染,頁面不會重新載入),故onload事件判定頁面沒有變化,所以不予執行!