Javascript 角度构建在服务器上不工作

Javascript 角度构建在服务器上不工作,javascript,angularjs,yeoman,Javascript,Angularjs,Yeoman,我正在尝试在服务器上运行AngularJS前端。我正在使用Yeoman构建应用程序。我上传了一个非常基本的hello world应用程序,并在加载JavaScript的情况下获得了纯HTML文本。Chrome中的控制台显示: Error: Unknown provider: aProvider <- a at Error (<anonymous>) at http://../scripts/vendor/d10639ae.angular.js:2627:15

我正在尝试在服务器上运行AngularJS前端。我正在使用Yeoman构建应用程序。我上传了一个非常基本的hello world应用程序,并在加载JavaScript的情况下获得了纯HTML文本。Chrome中的控制台显示:

Error: Unknown provider: aProvider <- a
    at Error (<anonymous>)
    at http://../scripts/vendor/d10639ae.angular.js:2627:15
    at Object.getService [as get] (http://../scripts/vendor/d10639ae.angular.js:2755:39)
    at http://../scripts/vendor/d10639ae.angular.js:2632:45
    at getService (http://../scripts/vendor/d10639ae.angular.js:2755:39)
    at invoke (http://../scripts/vendor/d10639ae.angular.js:2773:13)
    at Object.instantiate (http://../scripts/vendor/d10639ae.angular.js:2805:23)
    at http://../scripts/vendor/d10639ae.angular.js:4620:24
    at update (http://../scripts/vendor/d10639ae.angular.js:13692:26)
    at http://../scripts/vendor/d10639ae.angular.js:8002:24 d10639ae.angular.js:5526

我很确定您已经在生产服务器上使用了代码缩小器,对吗

无论如何,使用minifier可能会搞乱依赖注入,如果它没有正确完成。为什么会发生这种情况?看看:

依赖注入与代码精简
函数MyController($scope,$log){…}

在上面的代码片段中,您正在使用隐式DI。Angular查看变量
$scope
,并尝试将其与任何托管依赖项匹配。在本例中,它将与
$scope
对象相匹配

但是,在代码缩小后,这将不起作用,因为结果将以某种方式如下所示:

函数a(b,c){…}

由于变量名和函数名已缩小,Angular无法确切知道“a”是什么

解决方案 使用显式依赖项注入配置

var MyController = function($scope, $log) { ... }
MyController.$inject = ['$scope', '$log'];
在这个代码段中,您定义了哪些依赖项应该通过将它们的名称数组附加到名为
$inject
的控制器(或服务)的特殊属性来解析。现在Angular将知道它应该解析
$scope
,并将其作为第一个参数传递给
MyController
。然后它将解析
$log
,并将其作为第二个参数传递。
这一切都是可能的,因为迷你们不会修改字符串变量的内容。

正如@ŁukaszBachman所建议的,您可以使用$inject注释,或者如果您想:

  • 使依赖项注释靠近函数定义(以提高可读性)
  • 远离污染全局名称空间


    如果我像这样初始化控制器->
    yoAngApp.controller('MainCtrl',function($window,$scope){
    ?我像你说的那样编辑了代码,似乎不起作用-同样的问题(我在问题中添加了代码)…您需要在每个要最小化的脚本中使用适当的注释。下面是一个例子,证明内联注释在最小化的脚本中有效。此外,请确保在相同的周期内最小化角度源,以便最小化标识符(例如,
    angular.module
    变为
    a.m
    )在你的应用程序中都是一样的。太好了,我很高兴你们已经找到了答案!:)
    var MyController = function($scope, $log) { ... }
    MyController.$inject = ['$scope', '$log'];
    
    app.controller('UsersController',
      [
        '$scope', 'UserService', '$location', '$routeParams',
        function($scope, User, $location, $routeParams) {
          $scope.user = User.get({id: $routeParams.id});
          ...
        }
      ]
    );