2012-10-17 65 views
7

Tôi đang sử dụng AngularJS trong dự án Ruby on Rails 3.2.8 có nội dung.Lỗi: Nhà cung cấp không xác định: aProvider <- a

Khi tôi tải lên biểu mẫu đang sử dụng AngularJS trên máy phát triển của mình, tôi không gặp vấn đề gì. Tuy nhiên khi tôi tải các hình thức tương tự lên trên máy chủ sản xuất của tôi, tôi nhận được lỗi này trong bảng điều khiển Javascript:

Error: Unknown provider: aProvider <- a 

Tôi đã theo dõi nó trở lại tập tin coffeescript tôi, nơi tôi AngularJS thiết lập để sử dụng trong một hình thức:

$ (event) -> 
    $("#timesheet_description").autocomplete({source: '/autocomplete/work_descs'}) 

    # Create AngularJS module 
    app = angular.module 'timesheetApp', [] 

    # Create a AngularJS controller 
    app.controller "TimesheetCtrl", ($scope) -> 
    $scope.costed_amount = 0 
                           # Bind my module to the global variables so I can use it. 
    angular.bootstrap document, ["timesheetApp"] 

Nếu tôi nhận xét tất cả điều này, trang sẽ tải mà không có lỗi và không có khả năng AngularJS.

Vấn đề là do tài sản Rails có biên dịch và rút gọn? Có cách nào để sửa lỗi này và vẫn sử dụng tài sản coffeescript và Rails không?

+1

Tôi nhận thấy rằng nếu '$ scope' được đổi tên, nó sẽ bị hỏng. Tôi đề nghị một cách rõ ràng tiêm '$ scope' thông qua' app.controller ('TimesheetCtrl', ['$ scope', hàm ($ scope) {...}]); '(theo cách tương đương cofeescript) Có thể có khác như vậy trường hợp, mặc dù. – Tosh

+0

Điều đó đã sửa nó, cảm ơn bạn. – map7

Trả lời

20

AngularJS, khi sử dụng kiểu bạn đang sử dụng ngay bây giờ (được gọi là pretotyping), sử dụng các tên đối số hàm để thực hiện việc tiêm phụ thuộc. Vì vậy, có, minification không phá vỡ này hoàn toàn.

Việc khắc phục rất đơn giản. Trong mọi trường hợp bạn cần tiêm (đang sử dụng biến '$ xxx'), hãy thực hiện điều này:

Về cơ bản, thay thế tất cả các định nghĩa chức năng bằng một mảng. Phần tử cuối cùng phải là định nghĩa hàm chính nó và phần tử đầu tiên là $names của các đối tượng bạn muốn tiêm.

Có một số thông tin khác (mặc dù không đủ rõ ràng) trên docs.

+0

Có thêm thông tin tại đây: http: //docs.angularjs.org/tutorial/step_05 Tìm kiếm "A Note on Minification" –

+2

Và bạn có thể sử dụng mô-đun tuyệt vời, tuyệt vời để đảm bảo điều này cho bạn. Rất tốt giải thích trên egghead.io: https://egghead.io/lessons/angularjs-ngmin – Mat

+1

Hãy chắc chắn rằng bạn áp dụng mô hình này cho các bộ điều khiển chỉ thị cụ thể quá! – tsikov

6

Nếu bạn bỏ lỡ ký hiệu mảng ở đâu đó, để xác định vị trí này, chúng ta cần phải sửa đổi mã góc nhỏ, nhưng giải pháp rất nhanh của nó.

thay đổi là console.log ("Ký hiệu mảng bị thiếu", fn); (đường số 11 từ chức năng start)

Tìm hiểu chức năng chú thích trong angular.js (không minified)

function annotate(fn) { 
     var $inject, 
      fnText, 
      argDecl, 
      last; 

     if (typeof fn == 'function') { 
     if (!($inject = fn.$inject)) { 
      $inject = []; 
      if (fn.length) { 
console.log("Array Notation is Missing",fn); 
fnText = fn.toString().replace(STRIP_COMMENTS, ''); 
     argDecl = fnText.match(FN_ARGS); 
     forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){ 
      arg.replace(FN_ARG, function(all, underscore, name){ 
      $inject.push(name); 
      }); 
     }); 
     } 
     fn.$inject = $inject; 
    } 
    } else if (isArray(fn)) { 
    last = fn.length - 1; 
    assertArgFn(fn[last], 'fn'); 
    $inject = fn.slice(0, last); 
    } else { 
    assertArgFn(fn, 'fn', true); 
    } 
    return $inject; 
} 
+0

đây là một mẹo tuyệt vời, nhờ – Jason

+0

Đây là cách duy nhất tôi có thể tìm thấy cú pháp mảng bị thiếu. Cảm ơn một tấn! +1 –

0

Để rút gọn góc tất cả các bạn cần là phải làm là thay đổi tuyên bố của mình vào " mảng" tuyên bố "chế độ" ví dụ:

Từ:

var demoApp= angular.module('demoApp', []); 
demoApp.controller(function demoCtrl($scope) { 
}); 

Để

var demoApp= angular.module('demoApp', []); 
demoApp.controller(["$scope",function demoCtrl($scope) { 
}]); 

Làm thế nào để khai báo dịch vụ nhà máy?

demoApp.factory('demoFactory', ['$q', '$http', function ($q, $http) { 
    return { 
      //some object 
    }; 
}]); 
Các vấn đề liên quan