AngularJs:table中实现单元格展示多条可点击的数据(字符串split成array后,ng-repeat遍历)

    技术2022-07-11  128

    js文件:

    在js文件中,初始化声明表格的地方,在想要展示多条可点击数据的表头属性中,用一个自定义的属性做标记,标记本列需要做特殊的展示效果:

    $scope.tableConfig = {                 fixedWidth: 280,                 scrollWidth: 1400,                 tableCol: [{                         type: "",                         name: "冲销入库单号",                         dataField: "reverseOrder",                         width: 180,                         isShow: true,                         isFixed: false,                         multiClick: false,                         toSort: true,                         sortType: ""                     },                     /* -------------需要做特殊效果的列--------------- */                     {                         type: "",                         name: "转入单号",                         dataField: "regionAllotCodeIn",                         width: 180,                         isShow: true,                         isFixed: false,                         clickFn: "viewAllocationInDetail",  // 标记当前列可以点击                         multiClick: true,                   // 标记当前列展示多条可点击的数据,                         isIn: true,                         // 标记当前列是转入列,用于区分转出列                         toSort: true,                         sortType: ""                     },                     {                         type: "",                         name: "转出单号",                         dataField: "regionAllotCodeOut",                         width: 180,                         isShow: true,                         isFixed: false,                         clickFn: "viewAllocationOutDetail",                         multiClick: true,                         isOut: true,                         toSort: true,                         sortType: ""                     },                     /* ---------------------------------------- */                     ......... }

    声明完成后,我们调接口查询到的数据需要进行适当的转化,转化成我们想要在html上可以展示的数据格式:

    先看完整的方法:

    function getDataList(curPage) { $scope.markInfo = { allChecked: false, curRow: -1 }; $scope.exportParam.sectionParam.ids = []; var service = "device"; var reqUrl = "/threeReverse/list"; var param = {}; param.pageSize = $scope.pageInfo.pageSize; if (!!curPage) { $scope.pageInfo.curPage = curPage; } param.pageNum = $scope.pageInfo.curPage; param.filters = angular.copy($scope.condition); ybHttp.Post(service, reqUrl, param).then(function (resp) { if (resp.code !== 0) { ybWidget.ShowMessage(resp, MESG_TYPE.Error); return; } angular.forEach(resp.value.list, function (item, index) { item.isChecked = false; item.stateShow = $filter("ProgressStatus")(item.state, "inDepot"); item.isPostingShow = $filter("TrueOrFalse")(item.isPosting); item.isSapReverseShow = $filter("TrueOrFalse")(item.isSapReverse); item.createDateShow = $filter("YbDate")(item.createDate, "yyyy-MM-dd HH:mm:ss"); item.auditStateShow = $filter("ProgressStatus")(item.auditState, "audit"); if (!!item.regionAllotCodeIn) { item.regionAllotCodeInList = item.regionAllotCodeIn.split(','); } else { $scope.regionAllotCodeInList[index] = []; item.regionAllotCodeInList = []; } if (!!item.regionAllotCodeOut) { item.regionAllotCodeOutList = item.regionAllotCodeOut.split(','); } else { item.regionAllotCodeOutList = []; } }); $scope.pageInfo.totalRows = resp.value.total; $scope.pageInfo.totalPages = resp.value.pages; $scope.dataList = resp.value.list; }); }

    我们着重注意下面的这一段:

    用 split('') 做一个简单的处理,使用逗号分隔当前的字符串,将“转入单号”这一长串字符串转化成数组格式——

    方便我们在html中使用ng-repeat遍历出来展示。转出单号也做一样的操作。

    html文件: 

    在html文件中,我们只需要判断哪些列需要转化(使用我们在上面的js中做好的标记进行判断),使用ng-repeat,用<a>标签做一个可点击的链接就好了,看下图的处理:

    <tr ng-repeat="item in dataList track by $index" ng-class="{'row-selected': $index === markInfo.curRow}" ng-click="selectRow($index)"> <td class="spill-dots" ng-repeat="itemCol in tableConfig.tableCol" width="{{itemCol.width}}" ng-show="!!itemCol.isShow && !itemCol.isFixed" title="{{item[itemCol.dataField]}}"> <span ng-if="!itemCol.clickFn && itemCol.type !== 'operate'"> {{item[itemCol.dataField]}} </span> <!-- 转入单号、转出单号 --> <div ng-if="!!itemCol.clickFn && !!itemCol.multiClick && !!itemCol.isIn"> <a ng-repeat="it in item.regionAllotCodeInList" class="btn-operate m-r-xs" ng-click="tdClick(it, itemCol.clickFn)"> {{it}} </a> </div> <div ng-if="!!itemCol.clickFn && !!itemCol.multiClick && !!itemCol.isOut"> <a ng-repeat="it in item.regionAllotCodeOutList" class="btn-operate m-r-xs" ng-click="tdClick(it, itemCol.clickFn)"> {{it}} </a> </div> <div class="font-0" ng-if="itemCol.type === 'operate'"> <button type="button" class="btn btn-operate m-r-xs" ng-click="auditData(item)" ng-disabled="item.auditState != 0 || !btnPermission.threeOffsetAudit" title="{{!btnPermission.threeOffsetAudit?'无权限执行此操作':''}}"> 审核 </button> </div> </td> </tr>

    最外层tr上,我们遍历了列表的数据,这里我们获取了数据的序列号$index

    td上,我们使用ng-repeat="itemCol in tableConfig.tableCol"遍历了js上面表格的列的配置,将每列数据塞到td标签中。

    下面我们来看看转入、转出单号,也就是我们想要展示多条、并且做成可点击的链接的两列该怎么处理:

    这样就实现了我们想要的效果,看看页面上的展示效果吧:

     

    Processed: 0.011, SQL: 9