Angularjs ui-网格行休息调用

Angularjs ui-grid row rest call

我尝试通过 die ui-grid(v3.0.0-rc.20-8199eb5) 字段函数方法使用 $http 进行休息调用。请参阅下面的示例。

$scope.gridOptions = {
        enableSorting: true,
        columnDefs: [
          { name:'name', field: 'name' },
          { name:'getDepartment', field: 'getDepartment()', enableCellEdit:false}
        ],
        data : [      {
                           "name": "Rex",
                           "getDepartment" : function() {return deparmentService.findByName(this.name);}
                       }
                   ]
      };

}]);

浏览器进入无限循环。 departmentService $http 调用依赖于传递给它的名称参数 begin。

如何在加载行时从 ui- 网格中调用 $http ajax?

尝试在单独的文件中使用服务。这将帮助您组织代码。

app.factory('yService', ['$http', 'sessionService', function ($http, sessionService) {
    return {
        GetNames: function () {
            return $http({
                method: "get",
                url: "/api/Common/GetNames"
             });
        }
    }
}]);

从您的控制器, 像下面这样调用,

    yService.GetNames().success(function (data) {
                // copy your data to one object
//$scope.departments
            }).
                error(function (data) {

                });

在 ng-init 上调用上面的 yservice.GetNames 并像下面这样,

$scope.departments={};
    $scope.gridOptions = {
            enableSorting: true,
            columnDefs: [
              { name:'name', field: 'name' },
              { name:'getDepartment', field: 'getDepartment()', enableCellEdit:false}
            ],
            data : [      {
                               "name": "Rex",
                               "getDepartment" : $scope.departments;}
                           }
                       ]
          };

    }]);

为什么不获取数据,然后填充所有部门,然后给网格?

或者,获取数据,将其提供给网格,然后在后台,运行一个获取所有部门并将其填充到数据中的迭代器。

您真的不希望网格在每次呈现行时都调用 http 服务 - 它会在每次有人滚动时重新呈现行。 (不完全是,但在很多事件和一些卷轴上)

所以你最终会得到:

$scope.getDepartment = function(name) {
  return departmentService.findByName(name);
};

$scope.data = [
  name: 'Rex'
];

$scope.gridOptions = {
  enableSorting: true,
  columnDefs: [
    { name:'name', field: 'name' },
    { name:'getDepartment', field: 'getDepartment()', enableCellEdit:false}
  ],
  data: 'data'
};

// I'm imagining here that getDepartment is expensive
// so you may want to do this in batches or something
// but this illustrates that it's out of band - after the grid renders
$timeout( function() {
  $scope.data.forEach(function(row) {
    row.getDepartment = $scope.getDepartment(row.name);
  });
}, 100);