所以我试图加入Angular的潮流,我的任务是建立一个SPA,我已经选择了AngularJS和ASP.Net MVC Web API(我是.Net开发人员)。作为强类型语言的粉丝,我在整个职业生涯中尽可能地避免使用javascript,但是像AngularJS和其他库以及其他库那样的框架。插件近年来已经让人无法忽视。我在这里,请求一些指导。
我已经看过这些教程,完成了示例代码项目,并在PluralSight上做了一些学习,并且我有一些工作,至少从基础的角度来看。我有MVVM和MVC的丰富背景,所以SOC对我来说是件大事。我喜欢Angular提供的MVC类型的结构,这也是我首先走这条路的原因。
现在让我谈谈我的问题。我正在我的母版页(_Layout.cshtml)中初始化我的模块(当前),为了简单起见,我在调整和试验时做了这个。
<script>
angular.module('xcmApp', ['ngRoute', 'ngResource'])
.config(function ($routeProvider) {
$routeProvider
.when('/',
{
controller: 'companiesController',
templateUrl: 'views/companylist.html'
})
.when('/Reports',
{
controller: 'reportsController',
templateUrl: 'views/reportlist.html'
})
.otherwise({ redirectTo: '/' })
})
.factory('companiesFactory', ['$resource',
function ($resource) {
return $resource('/api/companies', {}, {
query: { method: 'GET', params: {}, isArray: true }
});
}
])
.controller('companiesController', function ($scope, companiesFactory) {
$scope.Companies = companiesFactory.query();
});
</script>
但是现在我已经准备好继续深入了解概念,我想将我的脚本分解成适当的文件。即,app.js和相关的控制器/工厂/服务等。但是,当我将该脚本移动到app.js并在_Layout.cshtml中引用它时,它会出错:
<script src="~/app.js"></script>
错误:[$ injector:unpr]未知提供者:a
现在没有必要继续突破控制器文件等,因为我甚至无法让app.js正常工作,所以我在这里被卡住了。我知道这里有一些非常出色的AngularJS开发人员可能知道我在读到这篇文章之前所缺少的东西,我很感谢你的帮助。
任何能够突显我监督的人今天都会成为我的超级巨星。提前谢谢!
编辑:
这是我的Stack Trace:
0x800a139e - JavaScript runtime error: [$injector:modulerr] Failed to instantiate module xcmApp due to:
Error: [$injector:unpr] Unknown provider: a
http://errors.angularjs.org/1.3.15/$injector/unpr?p0=a
at Anonymous function (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4015:13)
at getService (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4162:11)
at invoke (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4191:9)
at runInvokeQueue (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4109:11)
at Anonymous function (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4118:11)
at forEach (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:323:11)
at loadModules (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4099:5)
at createInjector (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:4025:3)
at doBootstrap (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:1452:5)
at bootstrap (http://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js:1473:5)
http://errors.angularjs.org/1.3.15/$injector/modulerr?p0=xcmApp&p1=Error%3A%20%5B%24injector%3Aunpr%5D%20Unknown%20provider%3A%20a%0Ahttp%3A%2F%2Ferrors.angularjs.org%2F1.3.15%2F%24injector%2Funpr%3Fp0%3Da%0A%20%20%20at%20Anonymous%20function%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4015%3A13)%0A%20%20%20at%20getService%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4162%3A11)%0A%20%20%20at%20invoke%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4191%3A9)%0A%20%20%20at%20runInvokeQueue%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4109%3A11)%0A%20%20%20at%20Anonymous%20function%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4118%3A11)%0A%20%20%20at%20forEach%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A323%3A11)%0A%20%20%20at%20loadModules%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4099%3A5)%0A%20%20%20at%20createInjector%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A4025%3A3)%0A%20%20%20at%20doBootstrap%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A1452%3A5)%0A%20%20%20at%20bootstrap%20(http%3A%2F%2Fajax.googleapis.com%2Fajax%2Flibs%2Fangularjs%2F1.3.15%2Fangular.js%3A1473%3A5)
提醒:
我的问题不在于它不起作用,它是否有效。当我从我的HTML页面中取出Javascript并将其放入引用的app.js文件时,它只是STOPS工作。
答案 0 :(得分:0)
返回文档。您正在使用一种定义应用程序的错误方法。尝试:
zuka/core
然后使用var MyApp = angular.module( 'MyApp', ['ngRoute' , 'ngSanitize']) ;
添加控制器,过滤器等
编辑:
顺便说一下,将Javascripts写在SPA的单独文件中是一个很好的做法(我猜你不是在写一个小项目)。答案 1 :(得分:0)
您的控制器定义中似乎缺少与依赖注入相关的一些声明部分。
在发布特定代码和修复程序之前,我想提一下有用的依赖注入问题的故障排除工具。 Angular有一个内置指令ng-strict-di
。该指令是ng-app
的伴侣。来自ng-app
documentation:
如果app元素上存在此属性,则将在&#34; strict-di&#34;中创建注入器。模式。这意味着应用程序将无法调用不使用显式函数注释的函数(因此不适合缩小),如the Dependency Injection guide中所述,有用的调试信息将有助于跟踪这些错误的根源。
现在,到帖子中的代码:
您的控制器未使用显式函数注释。在显式函数注释中,您传递依赖项的字符串数组,然后是函数。这确保即使缩小是重命名函数参数,Angular仍然可以识别要提供给函数的依赖项。您已在代码的某些部分中使用了显式注释,但在控制器定义中缺少该注释。
即使您从未定义过名为Error: [$injector:unpr] Unknown provider: a
的提供程序,也可以使用a
轻松识别。 ng-strict-di
会标记此控制器代码。
这是当前的代码和建议的修复。
而不是:
.controller('companiesController', function ($scope, companiesFactory) {
尝试:
.controller('companiesController', ['$scope', 'companiesFactory', function ($scope, companiesFactory) {
答案 2 :(得分:-1)
我没有ASP.net背景,但我认为回答你的Angular问题并不重要。
首先声明你的模块:
angular.module('myModule', []);
并获取这样的文件:
angular.module('myModule').controller/foactory/....
所以你的代码应该是这样的:
//xcmApp.module.js
angular.module('xcmApp', ['ngRoute', 'ngResource']);
//xcmApp.config.js
angular.module('xcmApp').config(function ($routeProvider) {
$routeProvider
.when('/',
{
controller: 'companiesController',
templateUrl: 'views/companylist.html'
})
.when('/Reports',
{
controller: 'reportsController',
templateUrl: 'views/reportlist.html'
})
.otherwise({redirectTo: '/'})
});
//xcmApp.factory.js
angular.module('xcmApp').factory('companiesFactory', ['$resource',
function ($resource) {
return $resource('/api/companies', {}, {
query: {method: 'GET', params: {}, isArray: true}
});
}
]);
//xcmApp.controller.js
angular.module('xcmApp').controller('companiesController', function ($scope, companiesFactory) {
$scope.Companies = companiesFactory.query();
});
编辑:
关于错误,请记住您的依赖项必须符合严格要求。 所以你的index.html(假设你使用don还没有使用脚本加载器)应该如下所示:
<script src="/*path to angular*/"></script>
<script src="/*path to ngRoute*/"></script>
<script src="/*path to ngResource*/"></script>
<script src="/*path to xcmApp.module.js*/"></script> //setting your app module must come first
<script src="/*path to xcmApp.config.js*/"></script>
<script src="/*path to xcmApp.factory.js*/"></script> //must come before the controller in your case
<script src="/*path to xcmApp.controller.js*/"></script>