"अनकैप्ड एरर: [$ इंजेक्टर: अनप्र]] तैनाती के बाद कोणीय के साथ


97

मेरे पास एक बहुत ही सरल कोणीय अनुप्रयोग है जो मेरी देव मशीन पर ठीक चलता है, लेकिन इस त्रुटि संदेश (ब्राउज़र कंसोल में) के साथ मैं इसे लागू करने के बाद विफल हो रहा हूं:

Uncaught Error: [$injector:unpr] http://errors.angularjs.org/undefined/$injector/unpr?p0=tProvider%20%3C-%20t%20%3C-%20%24http%20%3C-%20%24compile

उसके अलावा और कोई संदेश नहीं। यह तब होता है जब पृष्ठ पहले लोड होता है।

मैं ASP.NET MVC5, कोणीय 1.2RC3 चला रहा हूं, और git के माध्यम से Azure पर जोर दे रहा हूं।

Googling ने कुछ भी दिलचस्प नहीं किया है।

कोई सुझाव?

संपादित करें:

मैं टाइपस्क्रिप्ट का उपयोग कर रहा हूं, और $injectचर के साथ अपनी निर्भरता को परिभाषित कर रहा हूं , जैसे:

export class DashboardCtrl {

    public static $inject = [
        '$scope',
        '$location',
        'dashboardStorage'
    ];

    constructor(
        private $scope: IDashboardScope,
        private $location: ng.ILocationService,
        private storage: IDashboardStorage) {
    }
}

मेरा मानना ​​है कि न्यूनतमकरण के दौरान आने वाली स्थानीय चर नामकरण समस्याओं के आसपास (या करने का इरादा) है और इस त्रुटि का कारण बन सकता है।

उस ने कहा, यह स्पष्ट रूप से minification प्रक्रिया के साथ कुछ करना है, जब मैं BundleTable.EnableOptimizations = trueअपने देव मशीन पर सेट करता हूं, तो मैं इसे पुन: पेश कर सकता हूं।

जवाबों:


163

यदि आप अपने लिंक का पालन करते हैं, तो यह बताता है कि $ इंजेक्टर से त्रुटि परिणाम आपकी निर्भरता को हल करने में सक्षम नहीं है। यह कोणीय के साथ एक सामान्य मुद्दा है जब जावास्क्रिप्ट छोटा हो जाता है / उत्पादन के लिए जो कुछ भी आप कर रहे हैं, वह खराब हो जाता है।

मुद्दा तब है जब आपके पास एक नियंत्रक है;

angular.module("MyApp").controller("MyCtrl", function($scope, $q) {
  // your code
})

न्यूनतम परिवर्तन $scopeऔर $qयादृच्छिक चर में, जो कोणीय को बता नहीं सकता कि उसे क्या इंजेक्ट करना है। समाधान इस तरह से अपनी निर्भरता घोषित करना है:

angular.module("MyApp")
  .controller("MyCtrl", ["$scope", "$q", function($scope, $q) {
  // your code
}])

उससे आपकी समस्या हल हो जानी चाहिए।

बस फिर से पुनरावृति करने के लिए, मैंने जो कुछ भी कहा है वह उस लिंक पर है जो त्रुटि संदेश आपको प्रदान करता है।


2
वास्तव में लिंक पर जाने के सुझाव के लिए धन्यवाद - मैंने माना कि यह कुछ आंतरिक कलाकृतियां थीं, मेरे लाभ के लिए कुछ नहीं। जैसा कि यह पता चला है, मैं अपने सभी आश्रितों को $injectसार्वजनिक चर के माध्यम से परिभाषित कर रहा हूं , जो मुझे विश्वास है कि आप जिस तरह से सुझाव देते हैं उसके बराबर है (देखें docs.angularjs.org/guide/di )। मैं अपना सवाल अपडेट करूंगा।
केन स्मिथ

2
उस ने कहा, यह स्पष्ट रूप से minification प्रक्रिया के साथ कुछ करना है, जब मैं अपने देव मशीन ( BundleTable.EnableOptimizations = true;) पर ASP.NET MVC minifications मजबूर करता हूं , तो मैं समस्या को पुन: उत्पन्न कर सकता हूं। लगातार देखते रहे।
केन स्मिथ

ठीक है, यह पता लगा। एक और जगह थी जिसे मैं DI कर रहा था जिसे मैं भूल गया था, और यह मिनिमाइजेशन प्रक्रिया में गड़बड़ी हो रही थी। धन्यवाद, यह सही जवाब था।
केन स्मिथ

वहाँ भी एक पैकेज आप बुलाया के लिए वे अपने आप इस संभाल लेंगे है ngmin और कहा जाता है रेल के लिए एक इसी मणि ngmin-रेल
ब्रैडलीग्रिफ़िथ

2
@RyanTuck - दूसरे शब्दों में, अनअमाइंड कोड के साथ, कोणीय केवल आपके कार्यों में परिवर्तनशील नामों को देख सकता है, और एक अच्छा अनुमान लगा सकता है कि इंजेक्शन लगाने की क्या आवश्यकता है। लेकिन कीमा बनाया हुआ कोड के साथ, चर नाम सभी गूंगे हैं, इसलिए इसे कुछ अन्य तंत्र की आवश्यकता है - एक तंत्र जो कोड को संशोधित करने पर परिवर्तित नहीं होता है - यह जानने के लिए कि क्या इंजेक्ट करना है। यही कारण है कि $ इंजेक्शन सरणी और अन्य तंत्र खेलने में आते हैं।
केन स्मिथ

13

खुद को एक ही समस्या में भाग गया, लेकिन मेरी नियंत्रक परिभाषाएं ऊपर से थोड़ी अलग दिखीं। इस तरह परिभाषित नियंत्रकों के लिए:

function MyController($scope, $http) {
    // ...
}

घोषणा के बाद बस एक पंक्ति जोड़ें जो बताता है कि नियंत्रक के तत्काल होने पर कौन सी वस्तुओं को इंजेक्ट करना है:

function MyController($scope, $http) {
    // ...
}
MyController.$inject = ['$scope', '$http'];

यह इसे न्यूनतम-सुरक्षित बनाता है।


11

यह समस्या तब होती है जब नियंत्रक या निर्देश निर्भरता और फ़ंक्शन की एक सरणी के रूप में निर्दिष्ट नहीं होते हैं। उदाहरण के लिए

angular.module("appName").directive('directiveName', function () {
    return {
        restrict: 'AE',
        templateUrl: 'calender.html',
        controller: function ($scope) {
            $scope.selectThisOption = function () {
                // some code
            };
        }
    };
});

जब नियमावली नियंत्रक कार्य को पारित '$ गुंजाइश' को एकल अक्षर चर नाम से बदल दिया जाता है। यह निर्भरता के कोणीय अव्यवस्था को प्रस्तुत करेगा। इस से बचने के लिए एक सरणी के रूप में फ़ंक्शन के साथ निर्भरता नाम पास करें।

angular.module("appName").directive('directiveName', function () {
    return {
        restrict: 'AE',
        templateUrl: 'calender.html'
        controller: ['$scope', function ($scope) {
            $scope.selectThisOption = function () {
                // some code
            };
        }]
    };
});

10

यदि आपने कोणीय app \ resource \ directives और अन्य सामानों के लिए फाइलें अलग कर ली हैं तो आप अपने कोणीय app बंडल के minification को इस तरह से निष्क्रिय कर सकते हैं (अपनी बंडल config फाइल में ScriptBundle () के बजाय नए बंडल का उपयोग करें):

bundles.Add(
new Bundle("~/bundles/angular/SomeBundleName").Include(
               "~/Content/js/angular/Pages/Web/MainPage/angularApi.js",
               "~/Content/js/angular/Pages/Web/MainPage/angularApp.js",
               "~/Content/js/angular/Pages/Web/MainPage/angularCtrl.js"));

और कोणीय ऐप बंडल अनमॉडिफाइड में दिखाई देगा।


प्रदर्शन के बारे में, जो बेहतर है? बंडल () या ScriptBundle ()?
थॉमस.बेंग्

@ Thomas.Benz बंडल का उपयोग करना () केवल आपकी स्क्रिप्ट के लिए न्यूनतमकरण को अक्षम करेगा। यहाँ समस्या यह है कि जब ScriptBundle () कुछ कोणीय लिपियों को छोटा करता है, तो यह फ़ंक्शन के नाम को छोटा करता है और अन्य संबंधित सामग्री को करता है। और जब एंगुलर कुछ आंतरिक निर्भरता इंजेक्शन, या ऐसा कुछ करने की कोशिश करता है, तो वह उसके लिए उचित कार्य नहीं कर सकता है, क्योंकि उनके नाम कस्टम तरीके (जैसे 'सुपरकंट्रोलर' से 'एस' या अन्य) में बदल दिए गए थे। इसलिए बेहतर है कि कोणीय लिपियों को अनअमोडिफाइड छोड़ दें या डिफॉल्ट के बजाय मिनिमाइज़ेशन के लिए किसी अन्य लाइब्रेरी का उपयोग करने का प्रयास करें।
श्नापज़

1

यदि आपने कोणीय app \ resource \ directives और अन्य सामानों के लिए फाइलें अलग कर ली हैं तो आप अपने कोणीय app बंडल के minification को इस तरह से निष्क्रिय कर सकते हैं (अपनी बंडल config फाइल में ScriptBundle () के बजाय नए बंडल का उपयोग करें):


0

नियंत्रक fucntion में $ http, $ गुंजाइश सेवाओं को जोड़ें, कभी-कभी यदि वे गायब हैं तो ये त्रुटियां होती हैं।


0

मुझे एक ही समस्या थी लेकिन यह मुद्दा एक अलग था, मैं एक सेवा बनाने और इसे एक पैरामीटर के रूप में $ गुंजाइश देने की कोशिश कर रहा था।
इस त्रुटि को प्राप्त करने का एक और तरीका है, क्योंकि उस लिंक का प्रलेखन कहता है:

किसी वस्तु में एक स्कोप ऑब्जेक्ट को इंजेक्ट करने का प्रयास करना जो एक नियंत्रक या निर्देश नहीं है, उदाहरण के लिए एक सेवा, एक अज्ञात प्रदाता को भी फेंक देगा: $ गुंजाइशप्रोइडर <- $ गुंजाइश त्रुटि। यह तब हो सकता है यदि कोई गलती से किसी सेवा, पूर्व .:

angular.module('myModule', [])
       .service('MyController', ['$scope', function($scope) {
        // This controller throws an unknown provider error because
        // a scope object cannot be injected into a service.
}]);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.