在 AngularJS UI-grid 中使用 typeahead 和 cellNav
Using typeahead in AngularJS UI-grid with cellNav
我有一个用 ui-grid-cellNav
定义的 Angular-UI 网格,允许在单击时编辑单元格,还有一个自定义模板来显示 Angular- UI Bootstrap 预先输入特定列,如下所示:
index.html:
<head>
<script type="text/ng-template" id="TypeaheadTemplate.html">
<div style="height:100%">
<input ng-class="'colt' + col.uid" type="text" class="typeahead form-control" ng-model="MODEL_COL_FIELD"
uib-typeahead="name as item.name for item in grid.appScope.items | filter:$viewValue"
typeahead-editable="false"
typeahead-on-select="grid.appScope.typeaheadSelected(row.entity, $item)"></input>
</div>
</script>
</head>
<body ng-controller="MainCtrl">
<div ui-grid="gridOptions" ui-grid-edit ui-grid-cellNav></div>
</body>
controller.js
app.controller('MainCtrl', function($scope) {
$scope.items = [
{
id: 1,
name: "Item 1",
description: "Example Item #1"
},
{
id: 2,
name: "Item 2",
description: "Example Item #2"
}];
$scope.data = [{}, {}, {}]
$scope.columns = [
{
displayName: "Item",
field: "item.name",
editableCellTemplate: "TypeaheadTemplate.html",
cellTemplate: "TypeaheadTemplate.html",
enableCellEdit: true,
enableCellEditOnFocus: true
},
{
displayName: "Note",
name: "activityId",
enableCellEdit: true,
enableCellEditOnFocus: true
}]
$scope.gridOptions = {
data: $scope.data,
enableRowSelection: false,
showColumnFooter: true,
multiSelect: false,
enableSorting: false,
enableFiltering: false,
gridMenuShowHideColumns: false,
enableColumnMenus: false,
enableCellEditOnFocus: true,
minRowsToShow: 4,
columnDefs: $scope.columns
};
$scope.typeaheadSelected = function(entity, selectedItem) {
entity.item = selectedItem;
}
});
这很好用,ui-grid-cellNav
允许在“注释”列上单击编辑,并在“项目”列中进行提前输入。但是,最初单击网格中的预输入文本框会使文本框模糊,直到再次单击它为止,并且保持 Notes 中的单元格处于选中状态(但不可编辑)通常会阻止文本框被选中。因此,虽然它可以正常运行,但存在一些可用性问题。
我已经尝试过使用 ng-class
属性将 class 手动应用到文本框,认为在幕后有一些逻辑将元素与此 class,但无济于事。我在 API 文档中也找不到任何建议能够覆盖给定列的 cellNav 行为的内容。删除 ui-grid-cellNav
指令可以修复预输入焦点,但也会破坏单击编辑。
有没有什么方法可以让 Angular-UI 网格中的预输入与 ui-grid-cellNav
很好地配合?
您可以将任何带有预输入的列设置为 allowCellFocus
到 false
,这将确保 ui-grid-cellNav
不会将焦点从预输入文本框上移开 最初。需要注意的一点是,当 cellNav 单元格已经具有焦点时,预输入文本框仍需要单击两次,这会弄乱网格其余部分的制表符索引。
$scope.columns = [
{
displayName: "Item",
field: "item.name",
allowCellFocus: false, // Property added here
editableCellTemplate: "TypeaheadTemplate.html",
cellTemplate: "TypeaheadTemplate.html",
enableCellEdit: true,
enableCellEditOnFocus: true
},
// ...
];
如果可能,您应该考虑使用 ui-select
drop-down 代替预输入。这些在带有 cellNav 的网格中表现得更加可靠,但是您仍然需要考虑混乱的 tab-index 行为。
我有一个用 ui-grid-cellNav
定义的 Angular-UI 网格,允许在单击时编辑单元格,还有一个自定义模板来显示 Angular- UI Bootstrap 预先输入特定列,如下所示:
index.html:
<head>
<script type="text/ng-template" id="TypeaheadTemplate.html">
<div style="height:100%">
<input ng-class="'colt' + col.uid" type="text" class="typeahead form-control" ng-model="MODEL_COL_FIELD"
uib-typeahead="name as item.name for item in grid.appScope.items | filter:$viewValue"
typeahead-editable="false"
typeahead-on-select="grid.appScope.typeaheadSelected(row.entity, $item)"></input>
</div>
</script>
</head>
<body ng-controller="MainCtrl">
<div ui-grid="gridOptions" ui-grid-edit ui-grid-cellNav></div>
</body>
controller.js
app.controller('MainCtrl', function($scope) {
$scope.items = [
{
id: 1,
name: "Item 1",
description: "Example Item #1"
},
{
id: 2,
name: "Item 2",
description: "Example Item #2"
}];
$scope.data = [{}, {}, {}]
$scope.columns = [
{
displayName: "Item",
field: "item.name",
editableCellTemplate: "TypeaheadTemplate.html",
cellTemplate: "TypeaheadTemplate.html",
enableCellEdit: true,
enableCellEditOnFocus: true
},
{
displayName: "Note",
name: "activityId",
enableCellEdit: true,
enableCellEditOnFocus: true
}]
$scope.gridOptions = {
data: $scope.data,
enableRowSelection: false,
showColumnFooter: true,
multiSelect: false,
enableSorting: false,
enableFiltering: false,
gridMenuShowHideColumns: false,
enableColumnMenus: false,
enableCellEditOnFocus: true,
minRowsToShow: 4,
columnDefs: $scope.columns
};
$scope.typeaheadSelected = function(entity, selectedItem) {
entity.item = selectedItem;
}
});
这很好用,ui-grid-cellNav
允许在“注释”列上单击编辑,并在“项目”列中进行提前输入。但是,最初单击网格中的预输入文本框会使文本框模糊,直到再次单击它为止,并且保持 Notes 中的单元格处于选中状态(但不可编辑)通常会阻止文本框被选中。因此,虽然它可以正常运行,但存在一些可用性问题。
我已经尝试过使用 ng-class
属性将 class 手动应用到文本框,认为在幕后有一些逻辑将元素与此 class,但无济于事。我在 API 文档中也找不到任何建议能够覆盖给定列的 cellNav 行为的内容。删除 ui-grid-cellNav
指令可以修复预输入焦点,但也会破坏单击编辑。
有没有什么方法可以让 Angular-UI 网格中的预输入与 ui-grid-cellNav
很好地配合?
您可以将任何带有预输入的列设置为 allowCellFocus
到 false
,这将确保 ui-grid-cellNav
不会将焦点从预输入文本框上移开 最初。需要注意的一点是,当 cellNav 单元格已经具有焦点时,预输入文本框仍需要单击两次,这会弄乱网格其余部分的制表符索引。
$scope.columns = [
{
displayName: "Item",
field: "item.name",
allowCellFocus: false, // Property added here
editableCellTemplate: "TypeaheadTemplate.html",
cellTemplate: "TypeaheadTemplate.html",
enableCellEdit: true,
enableCellEditOnFocus: true
},
// ...
];
如果可能,您应该考虑使用 ui-select
drop-down 代替预输入。这些在带有 cellNav 的网格中表现得更加可靠,但是您仍然需要考虑混乱的 tab-index 行为。