【问题标题】:CellFilter is getting called before $http Response in UI-Grid在 UI-Grid 中的 $http 响应之前调用 CellFilter
【发布时间】:2017-09-28 18:51:48
【问题描述】:

我正在使用 ui-grid 绑定角色表中的数据,其中包含部门 ID 作为 PrimaryKey。我正在调用 Web Api 来获取表格中的所有角色并在 ui-grid 中显示。

部门表

角色表

我真正的问题是,当部门 ID 使用 cellFilter 绑定到网格时,我想将部门 ID 转换为部门名称,这就是为什么我声明 objMapping 来映射部门 ID 和部门名称。但是每次运行时,我都会看到 cellFilter 自定义函数,即“mapDepartmentName”在设置 objMapping 之前被调用,而且我无法在“mapDepartmentName”中引用 objMapping。

我的网格是这样的:-

但是,当我编辑时,我得到的结果如下,这是绝对正确的:-

我的代码 sn-p 如下:-

var myApp = angular.module('appHome', ['ui.grid', 'ui.grid.edit']);
myApp.controller("ctrlRole", ['$scope', 'MetadataOrgFactory', function ($scope, MetadataOrgFactory) {    
    var arrDepts = [];
    var objMapping = {};

    MetadataOrgFactory.getApiCall('getpublisheddepts', function (dataSuccess) {
        $scope.department = dataSuccess;
        for (var cntElem = 0; cntElem < dataSuccess.length; cntElem++) {
            
            var objDept = { id: dataSuccess[cntElem].DeptId, DeptId: dataSuccess[cntElem].DeptName }
            arrDepts.push(objDept);

            objMapping[dataSuccess[cntElem].DeptId] = dataSuccess[cntElem].DeptName;
            
        }      
        $scope.gridRole.columnDefs[1].editDropdownOptionsArray = arrDepts;
    }, function (dataError) {
    });
   

    $scope.gridRole = {
        data: 'roleData',
        columnDefs: [
          {
              field: 'RoleName', displayName: 'Role Name',              
          },
          {
              field: 'DeptId', displayName: 'Department Name',             
              editableCellTemplate: 'ui-grid/dropdownEditor',
              cellFilter: 'mapDepartmentName:this',
              editDropdownValueLabel: 'DeptId',
          },
          {
              field: 'RoleDesc', displayName: 'About Role',              
          },
          {
              field: 'WorkingHrs', displayName: 'Working Hours',              
          },
          {
              field: 'RequestNumber', displayName: 'RequestNumber',
              cellEditableCondition: true
          }
         
        ]

    }

    MetadataOrgFactory.getApiCall('getallroles', function (dataSuccess) {
        $scope.roleData = dataSuccess;
    }, function (dataError) {
    });

    
}])

.filter('mapDepartmentName', function () {
    return function (input, scope) {
        if (!input) {
            return '';
        } else {
            return objMapping[input];
        }
    };
});
<!DOCTYPE html>
<html>
<head>
    <title></title>	
    <style>
        .gridStyle {
            border: 5px solid #d4d4d4;
            height: 200px;
        }
    </style>
    <meta charset="utf-8" />
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.0/angular.min.js"></script>
    <link rel="stylesheet" href="https://cdn.rawgit.com/angular-ui/bower-ui-grid/master/ui-grid.min.css" />
    <script src="https://cdn.rawgit.com/angular-ui/bower-ui-grid/master/ui-grid.min.js"></script>
    <script src="../Scripts/AngularControllers/RoleController.js"></script>
    <script src="../Scripts/AngularServices/ApiCallService.js"></script>
</head>
<body ng-app="appHome">
    <div ng-controller="ctrlRole">
       
        <div class="gridStyle" ui-grid="gridRole" ui-grid-edit>
        </div>
    </div>

</body>
</html>

【问题讨论】:

    标签: javascript angularjs angularjs-scope ui-grid angularjs-http


    【解决方案1】:

    在工厂回调结束时在 getpublisheddepts 中调用 $scope.$apply()。

    因为你没有展示你的工厂,我相信它异步地做一些事情,这并没有通知视图来反映变化。

    【讨论】:

    • 这是异步调用。 $scope.$apply() 也没有帮助。
    【解决方案2】:

    我在这个问题上停留了很长时间。 我对代码进行了以下更改,我也得到了结果。请让我知道这是否是正确的解决方案:-

    MetadataOrgFactory.getApiCall('getpublisheddepts', function (dataSuccess) {
            $scope.department = dataSuccess;
            for (var cntElem = 0; cntElem < dataSuccess.length; cntElem++) {
    
                var objDept = { id: dataSuccess[cntElem].DeptId, DeptId: dataSuccess[cntElem].DeptName }
                arrDepts.push(objDept);
    
                objMapping[dataSuccess[cntElem].DeptId] = dataSuccess[cntElem].DeptName;
    
            }   
            $scope.deptmapping = objDeptMapping;     //new code added here
            $scope.gridRole.columnDefs[1].editDropdownOptionsArray = arrDepts;
        }, function (dataError) {
        });
    

    过滤器类

    .filter('mapDepartmentName', function () {
        return function (input, scope) {
            if (!input) {
                return '';
            } else {
                return scope.grid.appScope.deptmapping[input]; //Change in code 
            }
        };
    });  
    

    【讨论】:

    • 这就是你应该做的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 1970-01-01
    • 2022-11-30
    • 2020-08-21
    • 2020-04-14
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多