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.