【问题标题】:Javascript error Unknown provider: tProvider <- t after Rails minification AngularjsJavascript错误未知提供者:Rails缩小Angularjs后的tProvider <- t
【发布时间】:2013-09-27 19:32:11
【问题描述】:

我的 Rails 应用程序在编译资产时打开资产放大后无法运行。我将 Angular 控制器转换为使用括号表示法,并得到以下错误,有没有办法调试这个?

编译的application.js https://gist.github.com/jianbo/6665161

JS 错误

Error: Unknown provider: tProvider <- t
at Error (<anonymous>)
at me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:21665
at Object.i [as get] (me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:20671)
at me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:21753
at i (localme:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:20671)
at n (me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:20805)
at Object.r [as instantiate] (me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:21447)
at me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:818:604
at me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:28889
at r (me:3001/assets/application-4f6cd4e170fc6ce5d181d869af318557.js:817:8277) application-4f6cd4e170fc6ce5d181d869af318557.js:818
(anonymous function) application-4f6cd4e170fc6ce5d181d869af318557.js:818
(anonymous function) application-4f6cd4e170fc6ce5d181d869af318557.js:818
r.$broadcast application-4f6cd4e170fc6ce5d181d869af318557.js:818
(anonymous function) application-4f6cd4e170fc6ce5d181d869af318557.js:818
l application-4f6cd4e170fc6ce5d181d869af318557.js:818
l application-4f6cd4e170fc6ce5d181d869af318557.js:818
(anonymous function) application-4f6cd4e170fc6ce5d181d869af318557.js:818
r.$eval application-4f6cd4e170fc6ce5d181d869af318557.js:818
r.$digest application-4f6cd4e170fc6ce5d181d869af318557.js:818
r.$apply application-4f6cd4e170fc6ce5d181d869af318557.js:818
r application-4f6cd4e170fc6ce5d181d869af318557.js:818
m application-4f6cd4e170fc6ce5d181d869af318557.js:818
v.onreadystatechange application-4f6cd4e170fc6ce5d181d869af318557.js:818

【问题讨论】:

    标签: ruby-on-rails angularjs minify


    【解决方案1】:

    这个错误本身是 Angular 说它不知道为 't' 注入什么。这意味着 't' 必须是您在某处注射的一个缩小名称。

    如果它在缩小之前但在缩小之后不能工作,那么它一定是某个地方没有使用最小安全注入方法的问题。

    我会检查以确保您所做的一切都是最小安全的,并且您没有试图缩小 angular.js 本身的非最小安全版本。始终使用 Angular 包中的 .min 而不是缩小自己的(或者如果您确实想缩小自己的,请确保它是 minsafe 版本)。

    这是一个使控制器最小安全的示例。以下不是 minsafe:

    angular
        .module('myModule')
        .controller('MyCtrl', function($scope, myService) { 
            //your non-minsafe controller 
        });
    

    为了使其最安全,我们将函数调用封装在一个数组中,该数组以我们要注入的内容开始,并以相同的参数顺序结束函数调用:

    angular
        .module('myModule')
        .controller('MyCtrl', ['$scope', 'myService', function($scope, myService) { 
            //your minsafe controller 
        }]);
    

    【讨论】:

    • 嗨,迈克,我正在使用 angularjs-rails gem,它使用未缩小的 angular.js github.com/hiravgandhi/angularjs-rails/blob/master/vendor/…,这可能是原因吗?我应该用 angular.min.js 覆盖它吗?看起来错误在第 2997 行。谢谢
    • 查看 grunt-angular-templates 插件。
    • @user1883793 角度文件可能没有问题。 Mike 所说的是,除非您使用他描述的第二种语法,否则 Angular 的 DI 不适用于缩小。 Angular 从字面上解析函数头以确定要注入的服务,而缩小会混淆这些名称。
    • 我已经按照 Mike 所说的做了,并且通过我的 Angular 代码检查了几次,仍然找不到问题。有没有更好的方法来调试这个?谢谢
    • 嗨 - 你确定你没有缩小 angular.js 文件本身吗?如果您是,这可能会导致诸如您描述的问题。您应该改用 angular 下载包附带的 angular.min.js - 而不是缩小该文件。
    【解决方案2】:

    我对 gem hiravgandhi/angularjs-rails 有同样的问题

    通过更改我在 config/environments/production.rb 中的设置,我能够在生产中使用 OFF 小型化

    config.assets.js_compressor = Uglifier.new(mangle: false)

    按照 gem 安装说明使用带有 hiravgandhi/angularjs-rails gem 的 Rails 4.0.2 应用程序。

    【讨论】:

    • 为我工作。这是一个推荐的解决方案,还是只是能够掩盖某个地方的错误?
    • 为我工作,但是如果这隐藏了一些其他错误或者它真的是一个修复,这个问题是有效的?
    【解决方案3】:

    我遇到了同样的问题,我发现问题不在 .controller 调用中,而在 .config 中,它不是缩小安全的。

    之前

    var app = angular.module('myModule', ['restangular']);
    
    app.config(function(RestangularProvider) {
        RestangularProvider.setDefaultHeaders({'Content-Type': 'application/json'});
        RestangularProvider.setBaseUrl('http://myapi.com/api/v1');
    });
    

    之后

    var app = angular.module('myModule', ['restangular']);
    
    app.config(['RestangularProvider', function(RestangularProvider) {
        RestangularProvider.setDefaultHeaders({'Content-Type': 'application/json'});
        RestangularProvider.setBaseUrl('http://myapi.com/api/v1');
    }]);
    

    【讨论】:

    • 这个答案今天救了我的命。
    【解决方案4】:

    我对 angular-blockUI 模块有类似的问题。我想我可能不得不使用该文件的预缩小版本作为要加载的单独内容,而不是包含在 Web Essentials 包中。我们通过 bower 获得的一些代码根本没有准备好进行捆绑和缩小....

    【讨论】:

      猜你喜欢
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 2013-01-25
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      相关资源
      最近更新 更多