মোতায়েনের পরে কৌনিক সহ "আনকাচড ত্রুটি: [ject ইনজেক্টর: আনআরপিআর]"


99

আমার কাছে একটি মোটামুটি সহজ কৌণিক অ্যাপ্লিকেশন রয়েছে যা আমার ডেভ মেশিনে ঠিক জরিমানা চালায় তবে আমি এটি স্থাপনের পরে এই ত্রুটি বার্তায় (ব্রাউজার কনসোলে) ব্যর্থ হচ্ছি:

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

এর বাইরে আর কোনও বার্তা নেই। পৃষ্ঠাটি লোড হওয়ার পরে এটি ঘটে।

আমি এএসপি.নেট এমভিসি 5, কৌণিক 1.2RC3 চালাচ্ছি এবং গিটের মাধ্যমে অ্যাজুরে যাচ্ছি।

গুগলিং আকর্ষণীয় কিছু আপ না।

কোনও পরামর্শ?

সম্পাদনা:

আমি টাইপস্ক্রিপ্ট ব্যবহার করছি, এবং $injectভেরিয়েবলের সাথে আমার নির্ভরতাগুলি সংজ্ঞায়িত করছি , যেমন:

export class DashboardCtrl {

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

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

আমি বিশ্বাস করি যে মাইনাইফিকেশন চলাকালীন স্থানীয় ভেরিয়েবলের নামকরণের সমস্যাগুলি ঘাটতে হবে (বা উদ্দেশ্য করে) হওয়া উচিত এবং যা এই ত্রুটির কারণ হতে পারে।

এটি বলেছিল, এটি স্পষ্টভাবে মাইনীফিকেশন প্রক্রিয়াটির সাথে কিছু করার আছে, যখন আমি BundleTable.EnableOptimizations = trueআমার ডেভ মেশিনটি সেট করি তখন আমি এটি পুনরুত্পাদন করতে পারি।

উত্তর:


165

আপনি যদি আপনার লিঙ্কটি অনুসরণ করেন, এটি আপনাকে বলে যে ject ইনজেক্টর থেকে আপনার নির্ভরতাগুলি সমাধান করতে সক্ষম না হওয়ায় ত্রুটির ফলাফল। এটি কৌনিক সংক্রান্ত একটি সাধারণ সমস্যা যখন জাভাস্ক্রিপ্টটি মিনিমাইড / uglified / আপনি উত্পাদনের জন্য এটি যা করছেন তা হয়ে যায়।

সমস্যাটি যখন আপনার যেমন একটি নিয়ামক থাকে;

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

মিনিফিকেশনটি পরিবর্তন $scopeএবং $qএলোমেলো ভেরিয়েবলগুলিতে পরিবর্তিত হয় যা কৌণিকটি কী ইনজেকশন করতে হয় তা বলে না। সমাধানটি হ'ল আপনার নির্ভরতাগুলি এভাবে প্রকাশ করা:

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

এটা আপনার সমস্যা ঠিক করা উচিত।

কেবল পুনরাবৃত্তি করার জন্য, আমি যা কিছু বলেছি তা ত্রুটি বার্তা আপনাকে সরবরাহকারী লিঙ্কটিতে রয়েছে।


4
লিঙ্কটি দেখার জন্য পরামর্শের জন্য ধন্যবাদ - আমি ধরে নিয়েছিলাম এটি কিছু অভ্যন্তরীণ শৈল্পিক, আমার উপকারের জন্য কিছু নয়। দেখা যাচ্ছে যে, আমি আমার সমস্ত নির্ভরশীলতাগুলি $injectজনসাধারণের ভেরিয়েবলের মাধ্যমে সংজ্ঞায়িত করছি , যা আমি বিশ্বাস করি যে আপনি যেভাবে প্রস্তাব করেছেন তার সমান ( ডকস.আঙ্গুলারজেএস.আর / গাইড / ডিডি দেখুন )। আমি আমার প্রশ্ন আপডেট করব।
কেন স্মিথ

4
এটি বলেছিল, এটি ম্যানিফিকেশন প্রক্রিয়াটির সাথে স্পষ্টভাবে কিছু করার আছে, যখন আমি আমার ডিভাইসটিতে এএসপি.নেট এমভিসি মিনিফিকেশনগুলি চাপিয়ে দেই ( BundleTable.EnableOptimizations = true;) তখন আমি সমস্যাটি পুনরুত্পাদন করতে পারি। অবিরত দেখার জন্য।
কেন স্মিথ

ঠিক আছে, এটি সন্ধান। আমি ডিআই করছিলাম এমন আরও একটি জায়গা ছিল যা আমি ভুলে গিয়েছিলাম এবং এটি সংশোধন প্রক্রিয়াতে গণ্ডগোল হয়ে যাচ্ছিল। ধন্যবাদ, এটি সঠিক উত্তর ছিল।
কেন স্মিথ

এমন একটি প্যাকেজও রয়েছে যা আপনাকে স্বয়ংক্রিয়ভাবে এনজিমন বলে ডাকে এবং এনগমিন-রেল নামে পরিচিত কারাগারগুলির সাথে সম্পর্কিত মণি হ্যান্ডেল করবে ।
ব্র্যাডলেগ্রিফিথ

4
@ রায়ানটাক - অন্য কথায়, আনমিনিফাইড কোড সহ, কৌণিক আপনার ফাংশনগুলির পরিবর্তনশীল নামগুলি কেবল দেখতে পারে এবং কী কী ইনজেকশন লাগবে তা সম্পর্কে একটি ভাল অনুমান করতে পারে। তবে মিনিফায়েড কোড সহ, ভেরিয়েবলের নামগুলি সমস্ত মুগড হয়, সুতরাং এটির জন্য অন্য কিছু প্রক্রিয়া দরকার - কোডটি ক্ষুদ্রতর হয়ে গেলে পরিবর্তন হয় না এমন একটি প্রক্রিয়া - কী ইনজেকশন করতে হয় তা জানতে। সেখানেই $ ইনজেক্ট অ্যারে এবং অন্যান্য প্রক্রিয়াগুলি কার্যকর হয়।
কেন স্মিথ

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

আপনি যদি কৌণিক অ্যাপ্লিকেশন \ সংস্থানসমূহ c নির্দেশিকা এবং অন্যান্য স্টাফের জন্য ফাইলগুলি পৃথক করে থাকেন তবে আপনি কেবল নিজের কৌণিক অ্যাপ্লিকেশন বান্ডেলের এই জাতীয় বান্ডেলটি (আপনার বান্ডেল কনফিগারেশনের ফাইলের পরিবর্তে) স্ক্রিপ্টবান্ডেল () এর পরিবর্তে নতুন বান্ডেল () ব্যবহার করতে পারবেন:

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"));

এবং কৌণিক অ্যাপ্লিকেশনটি বন্ডলে অপরিবর্তিত থাকবে।


পারফরম্যান্স সম্পর্কে, কোনটি ভাল? বান্ডেল () বা স্ক্রিপ্টবান্ডেল ()?
টমাস.বেঞ্জ

@ থমাস.বেঞ্জ বান্ডেল ব্যবহার করে () কেবল আপনার স্ক্রিপ্টগুলির জন্য সংশোধন অক্ষম করবে। এখানে সমস্যাটি হ'ল স্ক্রিপ্টবান্ডেল () যখন কিছু কৌনিক স্ক্রিপ্টগুলি ছোট করে, তখন এটি ফাংশনটির নামগুলি সংক্ষিপ্ত করে এবং অন্যান্য সম্পর্কিত স্টাফ করে। এবং যখন কৌণিক কিছু অভ্যন্তরীণ নির্ভরতা ইনজেকশনগুলি করার চেষ্টা করে, বা এর মতো কিছু করে, তখন এটির জন্য উপযুক্ত ফাংশনগুলি খুঁজে পাওয়া যায়নি, কারণ তাদের নামগুলি কাস্টম পদ্ধতিতে পরিবর্তন করা হয়েছিল (যেমন 'সুপার কন্ট্রোলার থেকে' এস 'বা অন্য কোনও ক্ষেত্রে)। সুতরাং কৌণিক স্ক্রিপ্টগুলি মোছাবিহীন ছেড়ে দেওয়া বা ডিফল্টের পরিবর্তে অন্য কিছু লাইব্রেরি মিনিফিকেশনের জন্য ব্যবহার করার চেষ্টা করা ভাল।
Schnapz

1

আপনি যদি কৌণিক অ্যাপ্লিকেশন \ সংস্থানসমূহ c নির্দেশিকা এবং অন্যান্য স্টাফের জন্য ফাইলগুলি পৃথক করে থাকেন তবে আপনি কেবল নিজের কৌণিক অ্যাপ্লিকেশন বান্ডেলের এই জাতীয় বান্ডেলটি (আপনার বান্ডেল কনফিগারেশনের ফাইলের পরিবর্তে) স্ক্রিপ্টবান্ডেল () এর পরিবর্তে নতুন বান্ডেল () ব্যবহার করতে পারবেন:


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.
}]);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.