app.js

时间:2016-06-20 13:02:51

标签: angularjs asp.net-mvc asp.net-web-api single-page-application

所以我试图加入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工作。

3 个答案:

答案 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>