到目前为止,我只能通过使用单独的模板更改ng-grid中的编辑模式,并根据某些用户输入显示正确的模板。
示例:Plunker(重新调整列大小,然后切换到另一种模式)
这是一个问题,因为从模板切换到模板时,所执行的任何列重新调整大小,排序或分组都会丢失。
有更好的方法吗?
如果有兴趣,我通过修改ng-grid.js 2.0.7
为自己创建了一个解决方法首先,我修改了cellEditTemplate.html,并添加了属性disable-Cell = \“!isEditing \”(isEditing是控制器的范围变量,此变通方法需要该变量)
$templateCache.put("cellEditTemplate.html",
"<div ng-cell-has-focus disable-Cell=\"!isEditing\" ng-dblclick=\"editCell()\">\n" +
"\t<div ng-edit-cell-if=\"!isFocused\">\t\n" +
"\t\tDISPLAY_CELL_TEMPLATE\n" +
"\t</div>\n" +
"\t<div ng-edit-cell-if=\"isFocused\">\n" +
"\t\tEDITABLE_CELL_TEMPLATE\n" +
"\t</div>\n" +
"</div>"
);
然后我修改了ngCellHasFocus指令并在disableCell属性上添加了$ watch。当disableCell设置为true时,我阻止click和mousedown事件在该指令中触发。
return function ($scope, elm, attrs) {
var disabled = false;
//Added $watch
$scope.$watch(attrs.disableCell, function (newVal) {
disabled = newVal;
});
var isFocused = false;
var isCellEditableOnMouseDown = false;
$scope.editCell = function () {
if (!$scope.enableCellEditOnFocus) {
setTimeout(function () {
focusOnInputElement($scope, elm);
}, 0);
}
};
elm.bind('mousedown', function (evt) {
//Added return
if (disabled) return;
if ($scope.enableCellEditOnFocus) {
isCellEditableOnMouseDown = true;
} else {
elm.focus();
}
return true;
});
elm.bind('click', function (evt) {
//Added return
if (disabled) return;
if ($scope.enableCellEditOnFocus) {
evt.preventDefault();
isCellEditableOnMouseDown = false;
focusOnInputElement($scope, elm);
}
});
elm.bind('focus', function (evt) {
isFocused = true;
if ($scope.enableCellEditOnFocus && !isCellEditableOnMouseDown) {
focusOnInputElement($scope, elm);
}
return true;
});
elm.bind('blur', function () {
isFocused = false;
return true;
});
elm.bind('keydown', function (evt) {
if (!$scope.enableCellEditOnFocus) {
if (isFocused && evt.keyCode !== 37 && evt.keyCode !== 38 && evt.keyCode !== 39 && evt.keyCode !== 40 && evt.keyCode !== 9 && !evt.shiftKey && evt.keyCode !== 13) {
focusOnInputElement($scope, elm);
}
if (isFocused && evt.shiftKey && (evt.keyCode >= 65 && evt.keyCode <= 90)) {
focusOnInputElement($scope, elm);
}
if (evt.keyCode === 27) {
elm.focus();
}
}
return true;
});
};
}]);
这是我的网格选项
$scope.gridOptions = {
data: 'myData',
enableColumnResize: true,
enableCellSelection: true,
enableRowSelection: true,
enableCellEditOnFocus: true,
columnDefs: 'columnDefs',
plugins: [layoutPlugin],
//My row template has a ng-dblClick() attached to it for navigation in non-edit mode
rowTemplate: 'Templates/gridRowView.html'
};
答案 0 :(得分:1)
我对此进行了一些研究,据我所知,没有任何方法可以动态更改多个网格配置设置(包括编辑行为)。事实上,ng-grid git存储库中的issue #128让我觉得这个功能未来也未计划好。你仍然可以动态地change the columns或update the data,但我认为这根本不会对你有帮助。考虑到这一点,你采取的方法,或if / switch将运作良好。
另一种方法是使用不同的编辑模式,例如“类似Excel”的编辑模式。如果你搜索the examples page这是一个很好的例子。这可能是在不编辑和编辑之间的健康折衷,而实际上不需要对配置进行任何更改以在模式之间切换。我希望这有点帮助!
答案 1 :(得分:0)
我找不到任何简单的决定,并以这种方式解决了问题: 您可以将字符串分配给网格的columnDefs选项。 完成此任务后,您可以更改columnDefs,并且网格可以看到此更改。 在列中,您可以更改enableCellEdit。
$scope.columnDefs = [{ field:"name", displayName: "NAME", enableCellEdit: true},
{ field:"age", displayName: "AGE", enableCellEdit: true}];
var options = { data: 'myData',
columnDefs: 'columnDefs',
multiSelect: false,
enableCellEditOnFocus: true};
$scope.gridOptions = options;
$scope.makeReadOnly = function() {
for(i in $scope.columnDefs)
$scope.columnDefs[i].enableCellEdit = false;
}
plunker中的代码:http://plnkr.co/edit/3Xoao5?p=info
我在看完这个答案后找到了决定:https://stackoverflow.com/a/18405872/488848