【发布时间】:2016-03-04 07:55:22
【问题描述】:
我使用 AngularJS 1.5.0 和 UI-Grid 3.1.1 开发 Web 应用程序。
我需要有跨浏览器日期选择器的列,所以我决定使用 Bootstrap-Datepicker (https://github.com/eternicode/bootstrap-datepicker)。
对于本专栏,我使用 customTemplate:
rejestrator.columnTemplates.dayCellEditable =
'<div class="column-day">' +
'<span ng-model="row.entity.day" ng-change="updateDayCell(row, row.entity.day)" aa-date-input>{{ COL_FIELD | date:"yyyy-MM-dd" }}</span>'+
'</div>';
当我点击日单元格时,datepicker 会被正确调用,它甚至会使用所选数据更新行中的单元格,但不幸的是,没有触发函数 UpdateDayCell (ng-change),甚至 gridApi.edit.on.afterCellEdit...
我需要触发 updateDayCell 控制器的函数或触发事件以监听 on.afterCellEdit 以发送更新我的数据库的请求。
我的网格定义是:
$scope.myTaskGridOptions = {
exporterMenuCsv: false,
enableGridMenu: true,
enableSorting: true,
enableFiltering: false,
enableCellEditOnFocus: true,
columnDefs: [
{
name: 'Dzień',
field: 'day',
width: '130',
sort: { direction: 'asc', priority: 0 },
type: 'date',
cellFilter: 'date:\'yyyy-MM-dd\'',
cellTemplate: rejestrator.columnTemplates.dayCellEditable,
enableCellEdit:false
},
{
name: 'Projekt',
field: 'project_name',
editableCellTemplate: 'ui-grid/dropdownEditor',
width: '15%',
editDropdownOptionsFunction : MyTasksProvider.getMyProjects
},
{
name: 'Opis',
field: 'description',
width: '50%'
},
{
name: 'Czas',
field: 'used_time' ,
width: '75',
type: 'string',
cellTemplate: rejestrator.columnTemplates.timeCell,
enableCellEdit: false
},
{
name: 'Akcje',
field: 'id',
enableSorting: false,
width: '90',
cellTemplate: rejestrator.columnTemplates.actionsCell,
displayName: '',
enableColumnMenu:false,
enableCellEdit: false
}
],
//Bind events
onRegisterApi : function(gridApi){
$scope.gridApi = gridApi;
gridApi.edit.on.afterCellEdit($scope,function(rowEntity, colDef, newValue, oldValue){
if (newValue !== oldValue) {
var callback = function(){};
var fieldToChange = colDef.field,
valueToSet = newValue;
if (fieldToChange === 'project_name') {
fieldToChange = 'project_id';
callback = refreshGrid;
} else if (fieldToChange == 'day') {
valueToSet = $filter('date')(newValue, "yyyy-MM-dd");
rowEntity.day = valueToSet;
}
CommonTasksProvider.updateTaskFieldByID(rowEntity.id, fieldToChange, valueToSet, callback);
}
});
//gridApi.core.on.filterChange
},
//Disable multiselection
multiSelect: true
};
编辑:
我在设置值时添加了对 Datepicker 触发的事件 'aa:calendar:set-date' 的监视:
$scope.$on('aa:calendar:set-date', function(event, toState, toParams, fromState, fromParams){
var dateObj = event.targetScope.$parent.ngModel,
day = $filter('date')(dateObj, "yyyy-MM-dd"),
taskId = event.targetScope.$parent.taskId;
return CommonTasksProvider.updateTaskFieldByID(taskId, 'day', day)
});
它确实有效。小伙伴们,你们觉得这样的解决方法好吗?角度方式?或者性能昂贵?
【问题讨论】:
-
请发布有关上述问题的演示
标签: javascript angularjs datepicker angular-ui-grid