Angular中 判断ng-repeat 是否渲染结束与checkbox翻页的状态保存

在Angular项目中,遇到一个需求是用户在多页数据列表中选择项,翻页后需保存并恢复checkbox状态。问题在于,翻页后相同位置的checkbox会被错误地设置为checked。为解决此问题,可以监听ng-repeat的渲染完成,通过自定义指令并在controller中使用,确保在渲染结束后重置checkbox状态。同时,维护一个checkList来存储选定的数据,并在翻页时更新$rootScope.checkBoxVal,以便在不同页面间同步状态。在确认选择后,可以利用$rootScope.checkBoxVal回显选择数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目中有一个弹出框里面是数据列表,需要用户在多个翻页中选择(一条或多条都可以)。点击确认后,把选择的数据带回后面的页面显示。

实现该功能,存在的问题:在翻页后保存checkbox的状态。

思路: 不知道什么原因,在第一页选择后 第二页的同一个位置的checkbox也会有checked状态。希望能在翻页后页面渲染完成时把 checkbox的状态重置,再去根据点击翻页时保存的被选条。去动态判断checked 的状态。

首先,实现 “ 翻页后页面渲染完成时“ ,利用angular指令监听ng-repeat渲染完成后执行脚本

第一步自定义指令

         app.directive("repeatFinish",function ($timeout) {
    return function ($scope, $element,$attrs) {
        if($scope.$last==true){
       
            $timeout(function() {
                $scope.$emit('ngRepeatFinished');
            });
        }
    }
})

第二步 在对应的controller中使用

app.controller("repeatCtrl",["$scope",function($scope){
	$scope.$on('ngRepeatFinished', function() {					
                                            $scope.$watch($scope.pageList, function() {
				            // 每次翻页pageList都会发生变化,监听该变量,并在这里写入需要的函数
					})
		})	
        }])

第三步 在使用ng-repeat的页面中引入

    <tr repeat-finish ng-controller="repeatCtrl" ng-repeat="list in pageList  track by $index">
              ......  
    </tr>

以上是监听ng-repeat是否渲染结束

其次,在翻页时存储被选中的数据,在翻页中调用此函数,$scope.checkList保存已被选中的checkbox

 $scope.checkList = [];
  //该功能中的input checkbox 的id为数据中的bosID值 值唯一   
// $scope.bosIdCheck 是数组对象  保存所有的checkbox id
	$scope.checkBox=function(){
		for(var i=0;i<$scope.bosIdCheck.length;i++){		
                      if($("#"+$scope.bosIdCheck[i]).prop("checked")){
				$scope.checkList.push($scope.bosIdCheck[i]);
			}
		}	
	}

最后 ,就是在来回翻页中  将对应页面的对应选中状态回显。$scope.checkBoxVal为全局变量。选择结束点击确认带回数据时。可将该变量作为参数,调用接口。在页面上显示。  if函数整体可以封装一下。在点击确认按钮是

app.controller("repeatCtrl",["$scope",function($scope){
    $scope.setChecked=function(){
       if($scope.checkList.length!==0){			
		       for(var i=0;i<$scope.checkList.length;i++){
                                //去重
			 if($scope.checkBoxVal.indexOf($scope.checkList[i])<0){
                                $scope.checkBoxVal.push($scope.checkPList[i]);
			                        }
		                              }
		          for(var i=0;i<$scope.checkBoxVal.length;i++){
			          $("#"+$scope.checkBoxVal[i]).prop("checked",true);
		                        }
}	
$scope.$on('ngRepeatFinished', function() {$scope.$watch($scope.pagingList, function() { //清掉所有 checked 不清掉的话 前一页的checked 后一页同一个位置的checkbox也会有checked$(".table tbody input[type='checkbox']").prop("checked",false); })}) }])
对于angular的使用还不是很熟悉,还有很多可以赶紧的地方,会在修改后更新。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值