Nhà cung cấp không xác định: $ modalProvider <- $ modal lỗi với AngularJS


Câu trả lời:


197

Loại lỗi này xảy ra khi bạn viết phụ thuộc cho bộ điều khiển, dịch vụ, v.v. và bạn chưa tạo hoặc bao gồm phụ thuộc đó.

Trong trường hợp này, $modalkhông phải là một dịch vụ đã biết. Có vẻ như bạn đã không vượt qua ui-bootstrap như một phụ thuộc khi bootstrapping angle. angular.module('myModule', ['ui.bootstrap']);Ngoài ra, hãy đảm bảo rằng bạn đang sử dụng phiên bản mới nhất của ui-bootstrap (0.6.0) để an toàn.

Lỗi xảy ra trong phiên bản 0.5.0, nhưng cập nhật lên 0.6.0 sẽ làm cho dịch vụ $ modal khả dụng. Vì vậy, hãy cập nhật lên phiên bản 0.6.0 và đảm bảo yêu cầu ui.boostrap khi đăng ký mô-đun của bạn.

Trả lời nhận xét của bạn: Đây là cách bạn đưa vào một phụ thuộc mô-đun.

<!-- tell Angular what module we are bootstrapping -->
<html ng-app="myApp" ng-controller="myCtrl">

js:

// create the module, pass in modules it depends on
var app = angular.module('myApp', ['ui.bootstrap']);

// $modal service is now available via the ui.bootstrap module we passed in to our module
app.controller('myCtrl', function($scope, $uibModal) {

});

Cập nhật:

Các $modaldịch vụ đã được đổi tên $uibModal.

Ví dụ sử dụng $ uibModal

// create the module, pass in modules it depends on
var app = angular.module('myApp', ['ui.bootstrap']);

// $modal service is now available via the ui.bootstrap module we passed in to our module
app.controller('myCtrl', function($scope, $uibModal) {
    //code here
});

1
Tôi đã thêm ui.bootstrap và vẫn gặp lỗi tương tự? chúng ta có cần thêm chỉ thị dây đeo không? như đã nói ở đây stackoverflow.com/questions/18783974/…
Ranadheer Reddy,

1
@Ranadheer Liên kết của bạn liên quan đến dây đeo góc cạnh (đó là một thư viện khác). Như tôi đã nói, bạn đang sử dụng phiên bản cũ hơn của ui-bootstrap hoặc bạn đã không thêm phần phụ thuộc. Câu trả lời khác cũng có liên quan, rằng bạn cần phải nhập tên khi thu nhỏ, nhưng có vẻ như bạn đang xử lý thu nhỏ vào lúc này.
m59 25/09/13

2
Chào bạn @ m59. Bạn đang nghi thức. Tôi đã bao gồm phiên bản cũ của ui-bootstrap. Bây giờ tôi đã bao gồm phiên bản mới và nó hoạt động tốt. Thank you very much :-)
Ranadheer Reddy

59
$ Modal bây giờ sẽ đọc $ uibModal. Bạn không chắc chắn trong đó phiên bản nó thay đổi, nhưng tôi đã dành xa để dài cố gắng để get $ modal làm việc trước khi tìm ra nó hoạt động không còn ... Cùng với $ modalInstance, làm cho nó $ uibModalInstance
Delp

7
Thật tiếc khi họ thay đổi nó nhiều lần. Hộp thoại $ đầu tiên, sau đó là $ modal, bây giờ là $ uibModal. Chỉ ốm thôi. Cảm ơn vì đã cập nhật câu trả lời. Đã giúp tôi.
Steven

54

5 năm sau (đây không phải là vấn đề vào thời điểm đó) :

Không gian tên đã thay đổi - bạn có thể tình cờ gặp thông báo này sau khi nâng cấp lên phiên bản bootstrap-ui mới hơn ; bạn cần tham khảo $uibModal& $uibModalInstance.


Cảm ơn. Tôi đã sử dụng cùng một mã cho 2 ứng dụng nhưng nó không hoạt động cho ứng dụng cuối cùng. Thay đổi tên này có thể phá vỡ ứng dụng đang hoạt động !!!
Tchaps

2
Cảm ơn !, kể từ phiên bản 1.0.0 $ Modal và $ ModalInstance đã không được dùng nữa, thay đổi ở đây
HaRoLD

$ modalInstance hoàn toàn KHÔNG hoạt động với tôi. $ uibModalInstance đã làm
CommandZ 22/09/2016

22

Chỉ là một lưu ý bổ sung cho một vấn đề mà tôi cũng gặp phải hôm nay: Tôi đã gặp lỗi tương tự "Nhà cung cấp không xác định: $ aProvider" khi tôi bật tính năng thu nhỏ / uglify mã nguồn của mình.

Như đã đề cập trong hướng dẫn tài liệu Angular (đoạn: "Lưu ý về sự tối thiểu hóa"), bạn phải sử dụng cú pháp mảng để đảm bảo các tham chiếu được giữ chính xác cho việc chèn phụ thuộc:

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

Đối với ví dụ Angular UI Bootstrap mà bạn đề cập, bạn nên thay thế cái này:

var ModalInstanceCtrl = function ($scope, $modalInstance, items) { 
   /* ...example code.. */
}

với ký hiệu mảng này:

var ModalInstanceCtrl = ['$scope', '$modalInstance', 'items', function ($scope, $modalInstance, items) { 
   /* copy rest of example code here */ 
}];

Với thay đổi đó, mã cửa sổ phương thức giao diện người dùng Angular rút gọn của tôi đã hoạt động trở lại.


Tôi không nghĩ rằng anh ấy đang giải quyết vấn đề thu nhỏ ngay bây giờ, nhưng điều này đáng chú ý vì nó cũng có thể gây ra vấn đề tương tự.
m59 25/09/13

Hãy xem github.com/btford/ngmin Bạn có thể chạy nó trước khi thu nhỏ. Sau đó, bạn có thể tiếp tục viết shortform và phụ thuộc vào DI bằng các tên đối số trong khi việc rút gọn vẫn hoạt động khi ngmin mở rộng sang phiên bản mảng.
Pascal

11

Câu trả lời rõ ràng cho lỗi nhà cung cấp là thiếu phụ thuộc khi khai báo một mô-đun như trong trường hợp thêm ui-bootstrap. Một điều mà nhiều người trong chúng ta không tính đến là những thay đổi đột ngột khi nâng cấp lên bản phát hành mới. Có, những điều sau sẽ hoạt động và không gây ra lỗi cho nhà cung cấp:

var app = angular.module('app', ['ui.router', 'ngRoute', 'ui.bootstrap']);
app.factory("$svcMessage", ['$modal', svcMessage]);

Ngoại trừ khi chúng tôi đang sử dụng phiên bản ui-boostrap mới. Nhà cung cấp phương thức hiện được định nghĩa là:

.provider('$uibModal', function() {
    var $modalProvider = {
      options: {
        animation: true,
        backdrop: true, //can also be false or 'static'
        keyboard: true
      },

Lời khuyên ở đây là khi chúng tôi đã chắc chắn rằng các phần phụ thuộc được bao gồm và chúng tôi vẫn gặp lỗi này, chúng tôi nên kiểm tra phiên bản thư viện JS mà chúng tôi đang sử dụng. Chúng tôi cũng có thể thực hiện tìm kiếm nhanh và xem liệu nhà cung cấp đó có tồn tại trong tệp hay không.

Trong trường hợp này, nhà cung cấp phương thức bây giờ sẽ như sau:

app.factory("$svcMessage", ['$uibModal', svcMessage]);

Thêm một lưu ý nữa. Đảm bảo rằng phiên bản ui-bootstrap của bạn hỗ trợ phiên bản anglejs hiện tại của bạn. Nếu không, bạn có thể gặp các lỗi khác như templateProvider.

Để biết thông tin, hãy kiểm tra liên kết này:

http://www.ozkary.com/2016/01/angularjs-unknown-provider-modalprovider.html

hy vọng nó giúp.


ui bootstrap wiki chứa danh sách tất cả các thay đổi tiền tố.
bjauy

7

sau khi kiểm tra mà tôi đã tất cả dependancies bao gồm, tôi cố định vấn đề này bằng cách đổi tên $modalđể $uibmodal$modalInstanceđể$uibModalInstance


0
var ModalInstanceCtrl = ['$scope', '$modalInstance',  function ($scope, $modalInstance, items) { 
   /* copy rest of example code here */ 
}];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.