2014-04-17 25 views
15

OK Tôi chính thức bị hói ngay bây giờ, sau khi vướng tóc với vấn đề khét tiếng này: Ứng dụng AngularJS được khai thác không hoạt động, với lỗi này được phát hiện:AngularJS Lỗi: Nhà cung cấp không xác định: aProvider <- a

Error: [$injector:unpr] Unknown provider: aProvider <- a http://errors.angularjs.org/1.2.6/ $injector/unpr?p0=aProvider%20%3C-%20a at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11492 at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26946 at Object.c [as get] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250) at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:27041 at c (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250) at Object.d [as invoke] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26496) at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:910 at Object.f [as forEach] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11927) at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:856 at j (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:5:27235)

Rất nhiều người khác có vấn đề này là tốt, nhưng có vẻ như nó có thể được cố định bởi phụ thuộc tuyên bố như là một mảng thay vì thông số chức năng để trần, như thế này:

angular.module('my-app').controller('LoginCtrl', [ '$scope', 'HttpService', function($scope, HttpService) { ... }]); 

thay vì điều này:

angular.module('my-app').controller('LoginCtrl', function($scope, HttpService) { ... }); 

Nhưng nó không hoạt động trong trường hợp của tôi. Tôi đã kiểm tra tất cả các kịch bản lệnh của mình (cà phê và tạo các javascripts), tất cả chúng đều sử dụng khai báo kiểu mảng thích hợp.

Sự cố không đến từ các gói phụ. Tôi đã cố gắng di chuyển tất cả các tài liệu tham khảo gói thêm trong số <!-- bower:js --> khối (để chúng không được giảm bớt bởi grunt), nhưng vấn đề vẫn còn. Có nghĩa là, đó là mã của tôi để đổ lỗi ... Nhưng sau đó một lần nữa, tôi đã cố gắng (dường như) chỉ sửa chữa có sẵn, vô ích.

Bất kỳ gợi ý nào, ngay cả cách gỡ lỗi đúng cách này?

Cảm ơn trước!

+0

Bạn có thể vô hiệu hóa việc rút gọn và xem những nhà cung cấp được ném lỗi này. – Chandermani

+0

Vâng, nếu tôi vô hiệu hóa tính năng rút gọn và chỉ cần thực hiện với 'grunt serve', không có lỗi nào được ném - ứng dụng hoạt động hoàn hảo. –

+1

vô hiệu hóa từng mô-đun của bạn để phát hiện một phần mã của bạn có lỗi đó. Bạn có lỗi DI ở đâu đó. –

Trả lời

27

Cuối cùng tôi đã tìm thấy sự cố. Và có, đó là một lỗi DI mà tôi bỏ qua.

Đối với tất cả những người có thể bị đau đầu như nhau: khai báo định dạng mảng phải được thực hiện trong các tùy chọn 's. Trong trường hợp của tôi (CoffeeScript phía trước):

app.config (['$routeProvider', ($routeProvider) -> 
    $routeProvider 
    .when '/', 
     templateUrl: 'views/main.html' 
     controller: 'MainCtrl' 
     resolve: 
     groups: ['GroupService', (GroupService) -> # I MISSED THIS 
      return GroupService.getAll() 
     ] 
     entries: ['EntryService', (EntryService) -> # AND THIS 
      return EntryService.getAll() 
     ] 
    # ... 
]) 

Hy vọng điều này sẽ hữu ích!

+0

Bạn có thể đăng JS được tạo không? –

+0

Tôi đã dành cả ngày, cố gắng để giải quyết một vấn đề và cuối cùng, vấn đề là một cái gì đó đơn giản như thế này. –

+0

Tôi không thể upvote đủ. –

3

Hành vi này có thể xảy ra nếu bạn sử dụng tiêm ngầm, thay vì khai báo rõ ràng các phụ thuộc của bạn. Theo kinh nghiệm của tôi, tôi phải đối mặt với loại vấn đề này với các loại dịch vụ Angular.js cụ thể trả về lớp tức thời (ví dụ để tạo các lớp điều khiển trừu tượng hoặc một số trường hợp cụ thể khác).

Ví dụ: AbstractBaseControllerClass

Trong quá trình rút gọn, tôi đã gặp vấn đề tương tự. Tôi đã giải quyết bằng cách sử dụng khai báo nội bộ về tiêm phụ thuộc. Hy vọng điều này sẽ giúp

+0

Bạn đã cứu mạng tôi.Tôi đã dành rất nhiều thời gian freaking và giải pháp là sử dụng các tuyên bố nội bộ bên trong một trong những nhà cung cấp của tôi! –

0

Đối với những người không thích CoffeeScript.

Tôi chỉ cần lấy một số mã của tôi và đặt nó trong.

$stateProvider 

    .state('screen', { 
     url: '/user/', 
     templateUrl: 'user.html', 
     controller: 'UserController', 
     controllerAs: 'user', 
     location: "User", 
     resolve: ['$q', 'UserService', '$state', '$timeout', authenticateUser 
     ] 
    }) 

function authenticateUser($q, UserService, $state, $timeout) { 

    UserService.getLoginStatus().then(function() { 
     if (UserService.user) { 
      console.log("is user"); 
      return $q.when(); 
     } else { 
      console.log("not user"); 

      $timeout(function() { 
       // This code runs after the authentication promise has been rejected. 
       // Go to the log-in page 
       $state.go('login') 
      }); 
      return $q.reject() 

     } 
    }); 

} 
Các vấn đề liên quan