ผู้ให้บริการที่ไม่รู้จัก: $ modalProvider <- $ modal error กับ AngularJS


97

ฉันได้รับข้อผิดพลาดนี้อยู่เรื่อย ๆ ขณะพยายามติดตั้งหน้าต่าง bootstrap Modal สาเหตุของมันคืออะไร? ฉันคัดลอก / วางทุกอย่างจากhttp://angular-ui.github.io/bootstrap/#/modalที่นี่

คำตอบ:


197

ข้อผิดพลาดประเภทนี้เกิดขึ้นเมื่อคุณเขียนในการอ้างอิงสำหรับคอนโทรลเลอร์บริการ ฯลฯ และคุณยังไม่ได้สร้างหรือรวมการอ้างอิงนั้น

ในกรณี$modalนี้ไม่ใช่บริการที่รู้จัก ดูเหมือนว่าคุณไม่ได้ผ่าน ui-bootstrap เป็นการพึ่งพาเมื่อ bootstrapping angular angular.module('myModule', ['ui.bootstrap']);นอกจากนี้ตรวจสอบให้แน่ใจว่าคุณใช้ ui-bootstrap (0.6.0) เวอร์ชันล่าสุดเพื่อความปลอดภัย

ข้อผิดพลาดเกิดขึ้นในเวอร์ชัน 0.5.0 แต่การอัปเดตเป็น 0.6.0 ทำให้บริการ $ modal พร้อมใช้งาน ดังนั้นอัปเดตเป็นเวอร์ชัน 0.6.0 และต้องแน่ใจว่าต้องใช้ ui.boostrap เมื่อลงทะเบียนโมดูลของคุณ

ตอบกลับความคิดเห็นของคุณ:นี่คือวิธีที่คุณฉีดการพึ่งพาโมดูล

<!-- 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) {

});

อัปเดต:

บริการได้รับการเปลี่ยนชื่อเป็น$modal$uibModal

ตัวอย่างการใช้ $ 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
ฉันได้เพิ่ม ui.bootstrap แล้ว แต่ยังคงได้รับข้อผิดพลาดเหมือนเดิม? เราต้องเพิ่มคำสั่งสายรัดหรือไม่? ตามที่กล่าวไว้ที่นี่ stackoverflow.com/questions/18783974/…
Ranadheer Reddy

1
@Ranadheer ลิงก์ของคุณเกี่ยวกับ angular-strap (นั่นคือไลบรารีอื่น) ดังที่ฉันได้กล่าวไปแล้วคุณกำลังใช้ ui-bootstrap เวอร์ชันเก่ากว่าหรือคุณไม่ได้เพิ่มการอ้างอิง คำตอบอื่นก็เกี่ยวข้องเช่นกันคือคุณต้องส่งชื่อเมื่อทำการย่อขนาด แต่ดูเหมือนว่าคุณกำลังจัดการกับการลดขนาดในขณะนี้
m59

2
สวัสดี @ m59. คุณเป็นคนทำพิธี ฉันรวม ui-bootstrap เวอร์ชันเก่า ตอนนี้ฉันรวมเวอร์ชันใหม่แล้วและใช้งานได้ดี ขอบคุณมาก :-)
Ranadheer Reddy

59
ตอนนี้ $ modal ควรอ่าน $ uibModal ไม่แน่ใจว่าเวอร์ชันใดที่เปลี่ยนไป แต่ฉันใช้เวลานานในการพยายามทำให้ $ modal ทำงานก่อนที่จะพบว่ามันใช้งานไม่ได้อีกต่อไป ... เหมือนกันสำหรับ $ modalInstance ทำให้เป็น $ uibModalInstance
delp

7
น่าเสียดายที่พวกเขาเปลี่ยนมันซ้ำแล้วซ้ำเล่า กล่องโต้ตอบ $ แรกตามด้วย $ modal ตอนนี้คือ $ uibModal แค่ป่วย. ขอบคุณสำหรับการอัปเดตคำตอบ ช่วยฉันด้วย
Steven

54

5 ปีต่อมา (สิ่งนี้จะไม่มีปัญหาในขณะนั้น) :

namespacing มีการเปลี่ยนแปลง - คุณอาจสะดุดในข้อความนี้หลังจากที่อัพเกรดเป็นรุ่นที่ใหม่กว่าบูต-UI ; คุณต้องอ้างถึง$uibModal& $uibModalInstance.


ขอบคุณ. ฉันใช้รหัสเดียวกันสำหรับ 2 แอปพลิเคชัน แต่ใช้ไม่ได้กับอันสุดท้าย การเปลี่ยนแปลงการตั้งชื่อนี้สามารถทำลายแอปพลิเคชันที่ใช้งานได้ !!!
Tchaps

2
ขอบคุณ! เนื่องจากเวอร์ชัน 1.0.0 $ Modal และ $ ModalInstance ได้เลิกใช้แล้วการเปลี่ยนแปลงที่นี่
HaRoLD

$ modalInstance ไม่ได้ผลสำหรับฉันโดยสิ้นเชิง $ uibModalInstance ทำ
CommandZ

22

หมายเหตุเพิ่มเติมสำหรับปัญหาที่ฉันพบในวันนี้: ฉันมีข้อผิดพลาดที่คล้ายกัน"ผู้ให้บริการที่ไม่รู้จัก: $ aProvider" เมื่อฉันเปิดการย่อขนาด / อัปเกรดซอร์สโค้ดของฉัน

ดังที่ได้กล่าวไว้ในบทช่วยสอน Angular docs (ย่อหน้า: "หมายเหตุเกี่ยวกับการลดขนาด")คุณต้องใช้ไวยากรณ์ของอาร์เรย์เพื่อให้แน่ใจว่าการอ้างอิงถูกเก็บไว้อย่างถูกต้องสำหรับการแทรกการอ้างอิง:

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

สำหรับตัวอย่างAngular UI Bootstrap ที่คุณพูดถึงคุณควรแทนที่สิ่งนี้:

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

ด้วยสัญกรณ์อาร์เรย์นี้:

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

ด้วยการเปลี่ยนแปลงนั้นโค้ดหน้าต่างโมดัล Angular UI แบบย่อของฉันจึงทำงานได้อีกครั้ง


ฉันไม่คิดว่าเขากำลังจัดการกับการลดขนาดในตอนนี้ แต่สิ่งนี้ก็น่าสังเกตเพราะอาจทำให้เกิดปัญหาเดียวกันได้
m59

เข้าไปดูได้ที่github.com/btford/ngminคุณสามารถเรียกใช้งานได้ก่อนการย่อขนาด จากนั้นคุณสามารถเขียนชอร์ตฟอร์มได้ต่อไปและขึ้นอยู่กับ DI ตามชื่ออาร์กิวเมนต์ในขณะที่การย่อขนาดยังคงทำงานได้เนื่องจาก ngmin ขยายเป็นเวอร์ชันอาร์เรย์
Pascal

11

คำตอบที่ชัดเจนสำหรับข้อผิดพลาดของผู้ให้บริการคือการอ้างอิงที่ขาดหายไปเมื่อประกาศโมดูลเช่นเดียวกับในกรณีของการเพิ่ม ui-bootstrap สิ่งหนึ่งที่พวกเราหลายคนไม่ได้คำนึงถึงคือการเปลี่ยนแปลงที่สำคัญเมื่ออัปเกรดเป็นรุ่นใหม่ ใช่สิ่งต่อไปนี้ควรใช้งานได้และไม่เพิ่มข้อผิดพลาดของผู้ให้บริการ:

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

ยกเว้นเมื่อเราใช้ ui-boostrap เวอร์ชันใหม่ ขณะนี้ผู้ให้บริการโมดอลถูกกำหนดให้เป็น:

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

คำแนะนำที่นี่คือเมื่อเราตรวจสอบให้แน่ใจว่ามีการรวมการอ้างอิงและเรายังคงได้รับข้อผิดพลาดนี้เราควรตรวจสอบว่าเราใช้ไลบรารี JS เวอร์ชันใด นอกจากนี้เรายังสามารถค้นหาอย่างรวดเร็วและดูว่ามีผู้ให้บริการดังกล่าวอยู่ในไฟล์หรือไม่

ในกรณีนี้ผู้ให้บริการโมดอลควรเป็นดังนี้:

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

อีกหนึ่งบันทึก ตรวจสอบให้แน่ใจว่าเวอร์ชัน ui-bootstrap ของคุณรองรับ angularjs เวอร์ชันปัจจุบันของคุณ หากไม่เป็นเช่นนั้นคุณอาจได้รับข้อผิดพลาดอื่น ๆ เช่น templateProvider

สำหรับข้อมูลตรวจสอบลิงค์นี้:

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

หวังว่ามันจะช่วยได้


และui bootstrap wikiมีรายการการเปลี่ยนแปลงคำนำหน้าทั้งหมด
bjauy

7

หลังจากตรวจสอบว่าฉันมีการพึ่งพาทั้งหมดฉันได้แก้ไขปัญหาโดยเปลี่ยนชื่อ$modalเป็น$uibmodalและ$modalInstanceเป็น$uibModalInstance


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.