Rails 3 + AngularJS + 压缩在生产环境中无法正常工作:未知的提供者:eProvider

21

我已经按照我能找到的所有修复压缩问题的指示进行了操作,例如:

var MyController = function(renamed$scope, renamedGreeter) {
...
}
MyController.$inject = ['$scope', 'greeter'];

someModule.factory('greeter', ['$window', function(renamed$window) {
...;
}]);

然而,Angular仍然无法工作。它总是抛出错误"Unknown provider: eProvider"。

以下是我两次尝试使其工作的方式...有谁能帮忙吗?

https://github.com/jemminger/angular-test1

https://github.com/jemminger/angular-test2

它们已经预编译了资产,并配置了开发模式以便作为生产环境运行,因此您应该只需“rails s”即可查看它(不能)工作。


根据个人的目标,可能的解决方案是将缩小器缩小到较少破坏性的优化。在uglify的情况下,您可以使用mangle: false配置,并仍然通过删除空格来节省相当多的千字节。 - rymo
3个回答

60

找到原因了!他们从未提到将注入修复应用于服务... 解决方案是更改以下内容:

angular.module('itemServices', ['ngResource']).
    factory('Item', function($resource){
      return $resource('items/:item_id.json', {}, {
        query: {method:'GET', params:{ item_id: 'all' }, isArray:true}
      });
    });

转化为:

angular.module('itemServices', ['ngResource']).
    factory('Item', ['$resource', function($resource){
      return $resource('items/:item_id.json', {}, {
        query: {method:'GET', params:{ item_id: 'all' }, isArray:true}
      });
    }]);

4
@Josiah,这起作用是因为依赖注入允许函数在JavaScript代码被压缩时保持完整。 - jemminger
1
我建议在开发环境中使用ng-strict-di(https://docs.angularjs.org/api/ng/directive/ngApp),以便检测问题。 - Marco C.

14
记住,在指令内部的控制器上也要使用DI。这让我花费了数小时...C#示例:

错误的:

controller: ($scope) ->
  $scope.closeModal = ->
    ModalService.close()

正确:

controller: ["$scope"
  ($scope) ->
    $scope.closeModal = ->
      ModalService.close()
]

12
如果不依赖读者使用您选择的脚本解决方案,这将会更有帮助。 - ericpeters0n

6

请确保在模块中需要注入的所有函数定义中应用DI模式。有时候可能会遗漏,如果您使用routeProvider、factory、services等,它们都需要应用DI模式。我曾经在捕获所有问题之前部署了多次:P


很容易错过其中一个。没错,你必须将该模式应用于指令中定义的控制器!我浪费了一个美好的小时来寻找这个错误。 - anonymous

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接