无法在Angular UI Grid中的可扩展行中保存行

Bar*_*uza 6 javascript angularjs angular-ui angular-ui-grid

我正在尝试将行保存功能与可扩展网格结合使用.目标是能够独立于父行保存子网格行.

$scope.gridOptions = {
  expandableRowTemplate: 'components/grid/orderLineTemplate.html',
  expandableRowHeight: 150,

  expandableRowScope: {
    subGridVariable: 'subGridScopeVariable'

  },
  columnDefs: [
    {field: '_id'},
    {field: 'number'}
  ]
};

$http.get(ORDER_API)
  .success(function (data) {
    for (var i = 0; i < data.length; i++) {
      var rowScope = data[i];
      rowScope.subGridOptions = {
        appScopeProvider: $scope,
        columnDefs: [
          {field: 'amount'},
          {field: 'packageAmount'},
          {field: 'carrierAmount'}
        ],
        data: rowScope.orderLines,
        saveRow : $scope.saveRow
      }
    }
    $scope.gridOptions.data = data;
  });

$scope.gridOptions.onRegisterApi = function (gridApi) {
  $scope.gridApi = gridApi;
  gridApi.rowEdit.on.saveRow($scope, $scope.saveRow);
};

$scope.saveRow = function (order) {
  var promise = $q.defer();
  $scope.gridApi.rowEdit.setSavePromise(order, promise.promise);
  if(order.number) {
    $http.put(ORDER_API + '/' + order._id, order).success(function () {
      promise.resolve();
    }).error(function () {
      promise.reject();
    });
  }

}
});
Run Code Online (Sandbox Code Playgroud)

当我在父行中编辑字段时,会正确调用saveRow函数.当我编辑子行中的字段时,控制台中会显示以下消息;
'当saveRow事件被引发时,没有返回一个promise,或者没有人正在侦听事件,或者事件处理程序没有返回一个promise'
从未为扩展的子行调用SaveRow.

c0b*_*bra 3

您需要注册子网格 API。每个网格都有自己单独的 API 实例,您可以使用它来与其通信:

rowScope.subGridOptions = {
  appScopeProvider: $scope,
  columnDefs: [
    {field: 'amount'},
    {field: 'packageAmount'},
    {field: 'carrierAmount'}
  ],
  data: rowScope.orderLines,
  saveRow : $scope.saveRow,
  onRegisterApi: function (gridApi) {
    gridApi.rowEdit.on.saveRow($scope, $scope.saveRow)
  }
}
Run Code Online (Sandbox Code Playgroud)

这很接近,但是您正在使用 appScopeProvider 将我们的控制器范围注入到子网格范围中,而您实际上并不需要这样做。相反,我们可以使 saveRow 通用并将其绑定到我们想要的 gridApi。第一个参数bind()设置this函数的 。我们将只传递网格对象,但我们不需要它。绑定的第二个参数将是我们要传递的 gridApi。然后,在 saveRow 定义中,我们知道我们将收到正确的 API 作为第一个参数,然后收到 rowEntity 作为第二个参数。

// Main grid:
$scope.gridOptions.onRegisterApi = function(gridApi) {
  gridApi.rowEdit.on.saveRow($scope, saveRow.bind(gridApi.grid, gridApi));
};

// Subgrids:
onRegisterApi: function(gridApi) {
  gridApi.rowEdit.on.saveRow($scope, saveRow.bind(gridApi.grid, gridApi));
}

// Altered saveRow:
function saveRow(gridApi, rowEntity) {
  var promise = $q.defer();
  gridApi.rowEdit.setSavePromise( rowEntity, promise.promise );

  // fake a delay of 3 seconds whilst the save occurs, return error if gender is "male"
  $interval( function() {
    if (rowEntity.gender === 'male' ){
      promise.reject();
    } else {
      promise.resolve();
    }
  }, 3000, 1);
};
Run Code Online (Sandbox Code Playgroud)

由于您的子网格可能有不同的保存功能,因此要记住的主要事情是在所有子网格上注册“saveRow”事件onRegisterApi

这是一个演示上面代码的工作插件:http://plnkr.co/edit/52mp9C ?p=preview