我正在使用Angular 1.6 / MVC 4.6 / E.F 6.0在Web应用程序上工作。我还添加了UI-Grid。它运作良好。我尝试创建自定义过滤器,例如this part of documentation。我的目标是创建与" Age"相同的自定义过滤器。它在本地工作,但不是在我发布WebApp时。我有两个错误:
Possibly unhandled rejection: canceled
Error: [$injector:unpr] http://errors.angularjs.org/1.6.2/$injector/unpr?p0=nProvider%20%3C-%20n%20%3C-%20myCustomModalCtrl
我非常确定它与我为此自定义过滤器添加的控制器/指令有关。我已经引用了Angular JS help page,但我不知道如何纠正这个错误,以及为什么它只能在本地工作
JS
var PrintersApp = angular.module('PrintersApp', ['ui.grid', 'ui.grid.pagination', 'ui.grid.selection', 'ui.grid.exporter', 'ui.grid.moveColumns', 'ui.grid.autoResize']);
var Now = new Date();
PrintersApp.controller('PrintersController', ['$scope', '$http', '$filter', 'uiGridConstants',
function ($scope, $http, $filter, uiGridConstants) {
var store = $scope;
$scope.highlightFilteredHeader = function (row, rowRenderIndex, col, colRenderIndex) {
if (col.filters[0].term) {
return 'header-filtered';
} else {
return '';
}
};
var ExportDate = $filter('date')(Now, "MM-dd-yyyy");
$scope.gridOptions = {
enableFiltering: true,
paginationPageSizes: [25, 50, 75],
paginationPageSize: 25,
enableGridMenu: true,
enableSelectAll: false,
exporterMenuPdf: false,
exporterCsvFilename: ExportDate + '-PrintersDataExport.csv',
exporterCsvLinkElement: angular.element(document.querySelectorAll(".custom-csv-link-location")),
onRegisterApi: function (gridApi) {
$scope.gridApi = gridApi;
},
onRegisterApi: function (gridApi) {
$scope.gridApi = gridApi;
},
columnDefs: [
{ field: 'Date', enableFiltering: false, enableColumnMenu: false, enableSorting: false, width: 160 },
{ field: 'User', headerCellClass: $scope.highlightFilteredHeader, enableHiding: false, width: 160 },
{ field: 'Pc', headerCellClass: $scope.highlightFilteredHeader, enableHiding: false, width: 120 },
{ field: 'PrinterSrv', enableFiltering: $scope.highlightFilteredHeader, enableHiding: false, },
{
field: 'PrinterName',
filterHeaderTemplate: '<div class="ui-grid-filter-container" ng-repeat="colFilter in col.filters"><div my-custom-modal></div></div>',
width: 320,
},
{
field: 'Default', filter: {
type: uiGridConstants.filter.SELECT,
selectOptions: [{ value: 'true', label: 'true' }, { value: 'false', label: 'false' }, ]
},
headerCellClass: $scope.highlightFilteredHeader, enableColumnMenu: false, enableSorting: false, width: 150
},
]
};
$http.get('/AuditPrinters/GetAuditPrintersData')
.then(function (response) {
var datatest = response.data;
datatest.forEach(function addDates(row, index) {
TimeStamp = (row.Date).replace('/Date(', '').replace(')/', '')
row.Date = $filter('date')(TimeStamp, "MM/dd/yyyy HH:mm:ss");
});
$scope.gridOptions.data = datatest;
}, function (err) {
alert("Erreur" + rr);
});
$scope.toggleFiltering = function () {
$scope.gridOptions.enableFiltering = !$scope.gridOptions.enableFiltering;
$scope.gridApi.core.notifyDataChange(uiGridConstants.dataChange.COLUMN);
};
}])
PrintersApp.directive('myCustomDropdown', function () {
return {
template: '<select class="form-control" ng-model="colFilter.term" ng-options="option.id as option.value for option in colFilter.options"></select>'
};
})
PrintersApp.controller('myCustomModalCtrl', function ($scope, $compile, $timeout) {
var $elm;
$scope.showPrintersNameModal = function() {
$scope.listOfPrinters = [];
$scope.col.grid.appScope.gridOptions.data.forEach( function ( row ) {
if ($scope.listOfPrinters.indexOf(row.PrinterName) === -1) {
$scope.listOfPrinters.push(row.PrinterName);
}
});
$scope.listOfPrinters.sort();
$scope.gridOptions = {
data: [],
enableColumnMenus: false,
onRegisterApi: function( gridApi) {
$scope.gridApi = gridApi;
if ( $scope.colFilter && $scope.colFilter.listTerm ){
$timeout(function() {
$scope.colFilter.listTerm.forEach(function (PrinterName) {
var entities = $scope.gridOptions.data.filter( function( row ) {
return row.PrinterName === PrinterName;
});
if( entities.length > 0 ) {
$scope.gridApi.selection.selectRow(entities[0]);
}
});
});
}
}
};
$scope.listOfPrinters.forEach(function (PrinterName) {
$scope.gridOptions.data.push({ PrinterName: PrinterName });
});
var html = '<div class="modal" ng-style="{display: \'block\'}"><div class="modal-dialog"><div class="modal-content"><div class="modal-header">Filter Ages</div><div class="modal-body"><div id="grid1" ui-grid="gridOptions" ui-grid-selection class="modalGrid"></div></div><div class="modal-footer"><button id="buttonClose" class="btn btn-primary" ng-click="close()">Filter</button></div></div></div></div>';
$elm = angular.element(html);
angular.element(document.body).prepend($elm);
$compile($elm)($scope);
};
$scope.close = function() {
var printersname = $scope.gridApi.selection.getSelectedRows();
$scope.colFilter.listTerm = [];
printersname.forEach(function (PrinterName) {
$scope.colFilter.listTerm.push(PrinterName.PrinterName);
});
$scope.colFilter.term = $scope.colFilter.listTerm.join(', ');
$scope.colFilter.condition = new RegExp($scope.colFilter.listTerm.join('|'));
if ($elm) {
$elm.remove();
}
};
})
PrintersApp.directive('myCustomModal', function () {
return {
template: '<label>{{colFilter.term}}</label><button ng-click="showPrintersNameModal()">...</button>',
controller: 'myCustomModalCtrl',
};
});
答案 0 :(得分:2)
不确定这是否有帮助,但您的问题可能与myCustomModalCtrl
控制器的声明有关。与其他声明相比,此声明缺少注入服务的完整合格声明:
PrintersApp.controller('myCustomModalCtrl', function ($scope, $compile, $timeout) { [..] });
应该是:
PrintersApp.controller('myCustomModalCtrl', ['$scope', '$compile',
'$timeout', function ($scope, $compile, $timeout) { [..] }]);
当您的代码缩小时,参数$scope
将重命名为,例如a
。这会导致您收到的错误,因为a
中没有宣布名为$injector
的服务。
为了避免这个问题,我们必须告诉$injector
为我们在控制器中请求的每个参数注入正确的服务名称。
请查看this article了解详情。