Angular UI 导航时网格将焦点设置到单元格
Angular UI Grid set focus to cell on navigate
我有一个可编辑的网格。其中两列是 ItemCode 和 Quantity。当用户输入数量并按下向下键时,我希望下一行将焦点设置在下一行的 ItemCode 单元格上。我添加了这个事件侦听器,它进入了单元格,但它很快进入编辑模式,然后进入选定模式。如何确保单元格处于编辑模式?
gridApi.cellNav.on.navigate($scope, function (newRowcol, oldRowCol) {
$scope.$broadcast('uiGridEventEndCellEdit');
if (oldRowCol != null &&
oldRowCol.col.colDef.name == 'quantity' &&
oldRowCol.row != newRowcol.row) {
newRowcol.row.grid.api.cellNav
.scrollToFocus(newRowcol.row.entity,
newRowcol.row.grid.options.columnDefs[1]);
}
});
更新:这是我的专栏定义:
$scope.gridOptions.columnDefs = [
{
name: 'itemCode',
displayName: 'Part #',
editableCellTemplate: $scope.itemCodeEditableTemplate,
width: 150,
cellTooltip: function (row, col) {
return row.entity.itemCode
}
},
{
name: 'quantity', displayName: 'Qty', type: 'number', width: 60,
cellTooltip: function (row, col) {
return row.entity.quantity
}
}
]
正如我在上面评论的那样,我认为这是 angular-ui-grid 中的错误。我的解决方法如下...
问题是使用 scrollToFocus()
转到另一行,但您的正常键盘操作(制表符、向下箭头等)会将您带到具有 enableCellEdit: true
的列。因此,一种解决方法是将您调用 scrollToFocus()
的列设置为 enableCellEdit: false
.
它很难看,但我在每一列之后都创建了一个 "spacer" 列,可以从中选择标签。
{ name: 'itemCode', displayName: 'part #' },
{ name: 'quantity', displayName: 'qty' },
{ name: '_spacer1', displayName: '', width: '0%', minWidth: 1, maxWidth: 1, enableCellEdit: false },
{ name: 'someOtherColumn', displayName: 'something'},
所以,在我的例子中,我想捕捉一个从 "quantity" 到 "someOtherColumn" 的标签,如果 row.entity.quantity 的值是 0(例如),那么我会调用 scrollToFocus()
到下一行。因为用于制表符的正常下一个单元格有 enableCellEdit: false
它可以工作。
现在对于你的情况,我不确定它是否有帮助,因为你正在使用向下箭头键,这意味着你不是通过正常的键盘操作来更改列。但也许它给了你一个想法。 (此外,如果您的用户使用 Tab 而不是向下箭头,那么您可以使用解决方法,或者甚至可能不需要它,具体取决于您拥有的其他列。)
我认为一个更好的主意可能是重新打开我的错误(链接在上面的评论中)并说你也有问题,看看你是否能得到一个直接的答案,说明真正的问题是什么修复应该是! (我很想看。)
我有一个可编辑的网格。其中两列是 ItemCode 和 Quantity。当用户输入数量并按下向下键时,我希望下一行将焦点设置在下一行的 ItemCode 单元格上。我添加了这个事件侦听器,它进入了单元格,但它很快进入编辑模式,然后进入选定模式。如何确保单元格处于编辑模式?
gridApi.cellNav.on.navigate($scope, function (newRowcol, oldRowCol) {
$scope.$broadcast('uiGridEventEndCellEdit');
if (oldRowCol != null &&
oldRowCol.col.colDef.name == 'quantity' &&
oldRowCol.row != newRowcol.row) {
newRowcol.row.grid.api.cellNav
.scrollToFocus(newRowcol.row.entity,
newRowcol.row.grid.options.columnDefs[1]);
}
});
更新:这是我的专栏定义:
$scope.gridOptions.columnDefs = [
{
name: 'itemCode',
displayName: 'Part #',
editableCellTemplate: $scope.itemCodeEditableTemplate,
width: 150,
cellTooltip: function (row, col) {
return row.entity.itemCode
}
},
{
name: 'quantity', displayName: 'Qty', type: 'number', width: 60,
cellTooltip: function (row, col) {
return row.entity.quantity
}
}
]
正如我在上面评论的那样,我认为这是 angular-ui-grid 中的错误。我的解决方法如下...
问题是使用 scrollToFocus()
转到另一行,但您的正常键盘操作(制表符、向下箭头等)会将您带到具有 enableCellEdit: true
的列。因此,一种解决方法是将您调用 scrollToFocus()
的列设置为 enableCellEdit: false
.
它很难看,但我在每一列之后都创建了一个 "spacer" 列,可以从中选择标签。
{ name: 'itemCode', displayName: 'part #' },
{ name: 'quantity', displayName: 'qty' },
{ name: '_spacer1', displayName: '', width: '0%', minWidth: 1, maxWidth: 1, enableCellEdit: false },
{ name: 'someOtherColumn', displayName: 'something'},
所以,在我的例子中,我想捕捉一个从 "quantity" 到 "someOtherColumn" 的标签,如果 row.entity.quantity 的值是 0(例如),那么我会调用 scrollToFocus()
到下一行。因为用于制表符的正常下一个单元格有 enableCellEdit: false
它可以工作。
现在对于你的情况,我不确定它是否有帮助,因为你正在使用向下箭头键,这意味着你不是通过正常的键盘操作来更改列。但也许它给了你一个想法。 (此外,如果您的用户使用 Tab 而不是向下箭头,那么您可以使用解决方法,或者甚至可能不需要它,具体取决于您拥有的其他列。)
我认为一个更好的主意可能是重新打开我的错误(链接在上面的评论中)并说你也有问题,看看你是否能得到一个直接的答案,说明真正的问题是什么修复应该是! (我很想看。)