8

私は最近、Rails 3.2.3 バックエンドを使用して AngularJS 1.0.0rc8 アプリを作成し、開発では問題なく動作しましたが、Heroku にデプロイした後、不明なプロバイダー エラーが発生しました。明らかに、アプリはサービス オブジェクトを認識できませんでした。

angular-resource.js を別のファイルとしてインクルードし、次のようにアプリ モジュールにngResourceを挿入する必要があることはわかっています。

// main app javascript file

'use strict';

angular.module('contactapp', ['ngResource']).
  config(['$routeProvider', function($routeProvider) {
  $routeProvider.
      when('/contacts', {template: 'assets/app/partials/contact-list.html', controller: ContactListCtrl}).
      when('/contacts/new', {template: 'assets/app/partials/new-contact.html', controller: ContactListCtrl}).
      when('/contacts/:contact_id', {template: 'assets/app/partials/contact-detail.html', controller: ContactDetailCtrl}).
      otherwise({redirectTo: '/contacts'});      

}]);

また、ファイルが縮小されると、次のようにコントローラーオブジェクトにも注入されない限り、コントローラーは依存関係が何であるかを判断できないことも知っています。

ContactListCtrl.$inject = ['$scope', '$http', 'Contacts'];

また、Angular がブラケット表記を使用して次のような関数を渡すことを推奨する別の方法でそれを実行しようとしました。

var ContactListCtrl= ['$scope', '$http', 'Contacts', function($scope, $http, Contacts) { /* constructor body */ }];

ただし、これはどれも機能していないようです。

私のアプリケーションが提供されたリソースを確認できる唯一の方法は、次のように、Production.rb ファイルでアセットの圧縮をオフにすることでした。

# Compress JavaScripts and CSS
  config.assets.compress = false

これを理解するのに数時間かかりましたが、最近、同じ問題を抱えた別の Rails + AngularJS アプリを見ました。

Jens Krause は同じ結論に達し、彼のブログで説明しています: http://www.websector.de/blog/2012/01/17/fun-with-angularjs-rails-coffeescript-sass-another-cafe-townsend-例/

比較的大きなアプリがあり、アセットを圧縮する必要がある場合、Rails で Angular を使用してこれを回避するにはどうすればよいですか?

ありがとう。

4

3 に答える 3

7

Rails 4 を使用している場合はjs_compressor、本番環境とステージング環境を次のように変更します。

config.assets.js_compressor = Uglifier.new(mangle: false)
于 2014-01-24T23:10:04.790 に答える
3

問題は、ミニファイアがまだコントロール自体の変数名をわかりにくくしていることだと思います(ContactListCtrl-> aまたはそれが行うことは何でも)。

module.controller関数を使用してコントローラーを定義してみましたか?

angular.module('myModule', [])
.controller('Controller1', ['dep1', 'dep2', function(dep1, dep2) {
    //code
}]);
于 2012-05-20T00:41:32.203 に答える
2

Adding this line to my config/environments/production.rb did the trick for me:

config.assets.js_compressor = Sprockets::LazyCompressor.new { Uglifier.new(:mangle => false) }
于 2013-06-12T18:08:19.627 に答える