我如何使用 Angular 1.6 / MVC 4.6 / UI-Grid 纠正 $injector:unpr 错误



我正在开发一个带有Angular 1.6/MVC 4.6/E.F 6.0的Web应用程序。我还添加了UI-Grid。它运作良好。我正在尝试创建自定义过滤器,就像文档的这一部分一样。我的目标是创建与"年龄"相同的自定义过滤器。它适用于本地,但当我发布 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 帮助页面,但我不知道如何纠正此错误,以及为什么它只能在本地工作

.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',
  };
});

不确定这是否有帮助,但您的问题可能与myCustomModalCtrl控制器的声明有关。与其他声明相比,此声明缺少注入服务的完整限定声明:

PrintersApp.controller('myCustomModalCtrl', function ($scope, $compile, $timeout) { [..] });

应该是:

PrintersApp.controller('myCustomModalCtrl', ['$scope', '$compile', 
'$timeout', function ($scope, $compile, $timeout) { [..] }]);

当代码缩小时,参数$scope将重命名为,例如,a。这将导致您收到的错误,因为$injector中没有声明名为a的服务。

为了避免这个问题,我们必须告诉$injector为我们在控制器中请求的每个参数注入正确的服务名称。

有关详细信息,请查看本文。

最新更新