Angular контроллер не зарегистрирован

Я новичок в Angular JS, и я использую версию 1.6.

У меня есть это apptest.js script:

var myApp = angular.module("myApp", []);

(function(){
    "use strict";
    myApp.controller("productController", function($scope, $http)

    {
        $http.get('data/data.json').then(function(prd)
        {
            $scope.prd = prd.data;
        });
    });
});

И вот мои данные data/data.json:

[
  {
    "id":"1",
    "title":"20 Foot Equipment Trailer",
    "description":"2013 rainbow trailer 20 feet x 82 inch deck area, two 5,000 lb axels, electric brakes, two pull out ramps, break away box, spare tire.",
    "price":6000,
    "posted":"2015-10-24",
    "contact": {
      "name":"John Doe",
      "phone":"(555) 555-5555",
      "email":"[email protected]"
    },
    "categories":[
      "Vehicles",
      "Parts and Accessories"
    ],
    "image": "http://www.louisianasportsman.com/classifieds/pics/p1358549934434943.jpg",
    "views":213
  }
]

Теперь вот моя страница html, где я указал ng-app и ng-controller:

<body ng-app="myApp" ng-controller="productController">
<div class="row">
    <nav class="navbar navbar-default">
      <div class="container-fluid">
        <!-- Brand and toggle get grouped for better mobile display -->
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">Brand</a>
        </div>

        <!-- Collect the nav links, forms, and other content for toggling -->
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
          <ul class="nav navbar-nav">
            <li class="active"><a href="#">Add <span class="sr-only">(current)</span></a></li>
          </ul>
          <form class="navbar-form navbar-left">
            <div class="form-group">
              <input type="text" class="form-control" placeholder="Search">
            </div>
            <button type="submit" class="btn btn-default">Submit</button>
          </form>
        </div><!-- /.navbar-collapse -->
      </div><!-- /.container-fluid -->
    </nav>

    <div class="col-sm-4" ng-repeat="product in prd">
        <div class="panel panel-primary">
            <div class="panel-heading">{{product.title}}</div>
            <div class="panel-body">
                <img ng-src="{{product.image}}">
                {{product.price | currency}}
                {{product.description}}
            </div>
            <div class="panel-footer">a</div>
        </div>
    </div>
</div>

<script src="angular/angular.js"></script>
<script src="scripts/appTest.js"></script>
</body>

Я все еще получаю следующую ошибку, которая для меня новая:

angular.js: 14239 Ошибка: [$ controller: ctrlreg] Контроллер с имя 'productController' не зарегистрировано. http://errors.angularjs.org/1.6.0-rc.0/ $controller/ctrlreg? p0 = productController

Любая помощь приветствуется.

Ответы

Ответ 1

Из-за вашего Immediately Invoked Function Expression. вы должны изменить его, как показано ниже:

var myApp = angular.module("myApp", []);

(function(app){
  "use strict";
  app.controller("productController", function($scope, $http){
    $http.get('data/data.json').then(function(prd){
      $scope.prd = prd.data;
    });
  });
})(myApp);

Ответ 2

i импортируйте файл в index.html и моя проблема решена,

<script src=".../productController.js"></script>

Ответ 3

В моем случае на странице индекса отсутствовала ссылка, а мое имя контроллера было startupController (уведомление о нижнем регистре s), и я пытался зарегистрировать его с помощью startupController (верхний регистр s)

Ответ 4

В моем случае, с этой же ошибкой, я не смог идентифицировать модуль приложения в директиве ng-app следующим образом:

<div class="row" ng-app>

В некоторых случаях я видел, где ng-приложение само по себе, но я был вынужден идентифицировать приложение как:

<div class="row" ng-app="myApp">

Ответ 5

У меня та же проблема. Я решил проблему, поместив код JS в основной JS. мой HTML-это слой на основной HTML, мой оригинальный HTML и JS следующие:

<div style="background: #f5f5f5;" ng-app='myapp'  ng-controller="cIdentityCtrl as ctrl">
    <form class="padding-md" name="staffForm" ng-submit="submit()">
        <div class="row popup" style="padding-bottom: 10px;" ng-repeat="item in sfList">
            <label style="width: 130px;text-align: right;"> {{item.branchName}}:</label>
            <input type="text" style="width: 175px;display: inline-block;" class="form-control" ng-model="item.PERCENT"
                   placeholder="股份比例">%
        </div>
        <div class="clearfix"></div>
        <div class="height50"></div>
        <div class="text-center iframe-layer-btn">
            <button type="submit" class="btn btn-success" ng-disabled="staffForm.$invalid">保存</button>
            <button type="button" class="btn btn-default" ng-click="close()">关闭</button>
        </div>
    </form>
</div>

<script>
var myapp= angular.module('myapp',[]);
    (function(myapp){
        "use strict";
        myapp.service('layerService', layerService)
        .factory('instance', instance);
        myapp.controller('cIdentityCtrl', function($scope, instance, layerService) {
            console.log(instance.storeList)
            $scope.sfList = angular.copy(instance.storeList);
            $scope.submit = function(){
                for(var i=0;i<$scope.sfList.length;i++){
                    if($scope.sfList[i].PERCENT!=null && $scope.sfList[i].PERCENT!=''){
                        if(!/^(((\d|[1-9]\d)(\.\d{1,2})?)|100|100.0|100.00)$/.test($scope.sfList[i].PERCENT)){
                            massage.error($scope.sfList[i].branchName+'门店设置有误:[0,100]保留二位小数');
                            return false;
                        }
                    }
                }
                instance.fnsf($scope.sfList);
                layerService.close(instance.layero1);
            }

            $scope.close=function(){
                layerService.close(instance.layero1);
            }
        });

    })(myapp);
</script>


это html и js открываются с помощью ng-include, но не могут найти контроллер. и я поместил js в родительский html js файл, и он работал хорошо.

Ответ 6

Эта ошибка возникает при вызове службы $controller() со строкой, которая не соответствует ни одному из зарегистрированных контроллеров. Служба контроллера может быть вызвана напрямую или косвенно, например, через директиву ngController или внутри определения компонента/директивы/маршрута (при использовании строки для свойства контроллера). Сторонние модули также могут создавать экземпляры контроллеров с помощью функции $controller()

Причины этой ошибки могут быть:

1- Ваша ссылка на контроллер имеет опечатку. Например, в атрибуте директивы ngController, в свойстве контроллера определения компонента или в вызове $controller().

2- Вы не зарегистрировали контроллер (ни через Module.controller, ни $controllerProvider.register().

3- У вас есть опечатка в зарегистрированном имени контроллера.

ref: https://docs.angularjs.org/error/$controller/ctrlreg?p0=GreetingController

Ответ 7

У меня была та же проблема, и я нашел причину как... Модуль приложения в директиве ng-app был определен/использован на уровне тегов тела, как это

<body ng-app="intervalAngularExample">

и определение $ controller в productionController.js было импортировано в html файл на уровне заголовка, конечно, это не должно работать.

<head>
<script src=".../productController.js"></script>
</head>
<body ng-app="intervalAngularExample">
</body>

затем импорт должен быть внутри тега body.