AngularJS - 处理错误错误:[ng:areq] 在此特殊情况下 (?)

AngularJS - handling error Error: [ng:areq] in this special case (?)

本文关键字:错误 特殊情况下 areq 处理 ng AngularJS      更新时间:2023-09-26

>伙计们。

我试图设置一个带有角度指令的手风琴, 但我在控制台中收到此错误.

 Error: [ng:areq] http://errors.angularjs.org/1.3.2/ng/areq?p0=CustomDirectivesController&p1=not%20a%20function%2C%20got%20undefined
    at Error (native)
    at file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:6:416
    at Nb (file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:19:417)
    at ob (file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:20:1)
    at file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:75:177
    at file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:57:112
    at r (file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:7:408)
    at I (file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:56:496)
    at g (file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:51:299)
    at g (file:///Users/Marcelo/Desktop/Online-Colleges/capi/view/scripts/angular/angular.min.js:51:316)

这是我完整的AngularJS代码

customDirectives = angular.module('customDirectives', []);
  customDirectives.directive('customCollapse', function () {
    return {
     require: '?ngModel',
      scope:{
      ngModel: '='
    },
    restrict: 'A',
    template: '<div class="panel-group" id="{{panelId}}">'
    <div class="panel panel-default" ng-repeat-start="item in ngModel">'
    <div class="panel-heading">'
    <h4 class="panel-title">'
    <a ng-click="toggleCollapsedStates($index)" href="#{{panelBaseId}}-{{$index}}">{{item.title}}</a>'
    </h4>'
    </div>'
    <div id="{{panelBaseId}}-{{$index}}" data-parent="#{{panelId}}" class="panel-collapse collapse">'
    <div class="panel-body">{{item.content}}</div>'
    </div>'
    </div>'
    <div ng-repeat-end></div>'
    </div>',
    link: function (scope, el, attrs) {
      scope.panelBaseId = attrs.collapsePanelBodyId;
      scope.panelId = attrs.collapsePanelId;
      $(document).ready(function(){
        angular.forEach(scope.ngModel, function(value, key){
          if (value.collapsed)
          {
            $("#" + scope.panelBaseId + "-" + key).collapse('show');
          }
        });
      });
      scope.toggleCollapsedStates = function(ind){
        angular.forEach(scope.ngModel, function(value, key){
          if (key == ind)
          {
            scope.ngModel[key].collapsed = !scope.ngModel[key].collapsed;
            $("#" + scope.panelBaseId + "-" + ind).collapse('toggle');
          }
          else
            scope.ngModel[key].collapsed = false;
        });
      }
    }
  };
});
angular.module('CustomComponents', ['customDirectives']);
function CustomDirectivesController($scope)
{
  $scope.collapseData = [
  {
    title: "Collapse Group Item Title 1",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: true
  },
  {
    title: "Collapse Group Item Title 2",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: false
  },
  {
    title: "Collapse Group Item Title 2",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: false
  }
  ];
}

还有我的 HTML:

<div ng-app="customDirectives">
  <div ng-controller="CustomDirectivesController">
    <div custom-collapse ng-model="collapseData" collapse-panel-id="collapse-panel" collapse-panel-body-id="collapse-panel-body"></div>
  </div>
</div>

刚刚检查了有关同一问题的其他问题,但我看到我做得很好,可以看到我在这里犯了什么错误?

那么,有人可以解释我发生了什么吗?

是的,实际上我只是通过设置正确的控制器和依赖项来处理此错误。

在html中,一切都很好。

问题是我正在声明全局函数。看看新代码,这样就会明白:

    var customDirectives = angular.module('customDirectives', []);
customDirectives.directive('customCollapse', function () {
  return {
    require: '?ngModel',
    scope:{
      ngModel: '='
    },
    restrict: 'A',
    template: '<div class="panel-group" id="{{panelId}}">'
    <div class="panel panel-default" ng-repeat-start="item in ngModel">'
    <div class="panel-heading">'
    <h4 class="panel-title">'
    <a ng-click="toggleCollapsedStates($index)" href="#{{panelBaseId}}-{{$index}}">{{item.title}}</a>'
    </h4>'
    </div>'
    <div id="{{panelBaseId}}-{{$index}}" data-parent="#{{panelId}}" class="panel-collapse collapse">'
    <div class="panel-body">{{item.content}}</div>'
    </div>'
    </div>'
    <div ng-repeat-end></div>'
    </div>',
    link: function (scope, el, attrs) {
      scope.panelBaseId = attrs.collapsePanelBodyId;
      scope.panelId = attrs.collapsePanelId;
      $(document).ready(function(){
        angular.forEach(scope.ngModel, function(value, key){
          if (value.collapsed)
          {
            $("#" + scope.panelBaseId + "-" + key).collapse('show');
          }
        });
      });
      scope.toggleCollapsedStates = function(ind){
        angular.forEach(scope.ngModel, function(value, key){
          if (key == ind)
          {
            scope.ngModel[key].collapsed = !scope.ngModel[key].collapsed;
            $("#" + scope.panelBaseId + "-" + ind).collapse('toggle');
          }
          else
            scope.ngModel[key].collapsed = false;
        });
      }
    }
  };
})
customDirectives.controller('CustomDirectivesController', function($scope)
{
  $scope.collapseData = [
  {
    title: "Collapse Group Item Title 1",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: true
  },
  {
    title: "Collapse Group Item Title 2",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: false
  },
  {
    title: "Collapse Group Item Title 5",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: false
  },
  {
    title: "Collapse Group Item Title 4",
    content: "Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.",
    collapsed: false
  }
  ];
});