অ্যাপ্লিকেশন কনফিগারেশন, কৌণিক.জেজে কাস্টম সরবরাহকারীর ভিতরে $ http ব্যবহার করুন


90

মূল প্রশ্ন - এটা কি সম্ভব? আমি ভাগ্য না দিয়ে চেষ্টা করেছি ..

প্রধান অ্যাপ্লিকেশন

...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {

}]);
...

সরবরাহকারী নিজেই

var services = angular.module('services', []);
services.provider('custom', function ($http) {
});

এবং আমি যেমন ত্রুটি পেয়েছি:

Uncaught Error: Unknown provider: $http from services 

কোন ধারনা?

ধন্যবাদ!


পক্ষে সম্ভব - plnkr.co/edit/Sk9NmIIwO3B0Bg1bNP3S?p=preview
সেট

মানুষ, হ্যাঁ এটি সত্য, তবে আমি app.configঅংশ সম্পর্কে কথা বলছি
কোসমেটিকা


আমি এই সীমাবদ্ধতা সম্পর্কে জানি কিন্তু ভেবেছিলাম অভ্যন্তরীণ সরবরাহকারীর পক্ষে এটি কোনওভাবেই সম্ভব ..
কোসমেটিকা

উত্তর:


158

নীচের লাইনটি হ'ল:

  • আপনি সরবরাহকারীর কনফিগারেশন বিভাগে কোনও পরিষেবা ইনজেক্ট করতে পারবেন না
  • আপনি যে বিভাগটি সরবরাহকারীর পরিষেবাটি আরম্ভ করে সেটিতে একটি পরিষেবা ইনজেক্ট করতে পারেন

বিশদ:

কৌণিক কাঠামোর একটি 2 ধাপের সূচনা প্রক্রিয়া রয়েছে:

পদক্ষেপ 1: কনফিগার করুন

configপর্বের সময় সমস্ত সরবরাহকারীকে আরম্ভ করা হয় এবং সমস্ত configবিভাগ কার্যকর করা হয়। configবিভাগে কোড যা প্রদানকারী বস্তু কনফিগার এবং সেইজন্য তারা প্রদানকারী বস্তুর সঙ্গে ইনজেকশনের করা যাবে থাকতে পারে। তবে, যেহেতু সরবরাহকারীরা পরিষেবা সামগ্রীর কারখানা এবং এই পর্যায়ে সরবরাহকারী সম্পূর্ণরূপে আরম্ভ / কনফিগার করা হয় না -> আপনি এই পর্যায়ে আপনার জন্য পরিষেবা তৈরি করতে সরবরাহকারীকে বলতে পারবেন না -> কনফিগারেশন পর্যায়ে আপনি / ব্যবহার করতে পারবেন না ইনজেকশন সেবা । এই ধাপটি শেষ হলে সমস্ত সরবরাহকারী প্রস্তুত থাকে (কনফিগারেশন পর্বটি শেষ হওয়ার পরে আর কোনও সরবরাহকারীর কনফিগারেশন করা যাবে না)।

পদক্ষেপ 2: চালান

runপর্যায়ের সময় সমস্ত runবিভাগ কার্যকর করা হয়। এই পর্যায়ে প্রদানকারীর জন্য প্রস্তুত হয় এবং পরিষেবার তৈরি করতে পারেন -> সময় runফেজ আপনার পরিষেবার উদ্বুদ্ধ ব্যবহার করতে পারেন /

উদাহরণ:

1. $httpসরবরাহকারী আরম্ভকরণ ফাংশনে পরিষেবা ইনজেকশন কাজ করবে না

//ERRONEOUS
angular.module('myModule').provider('myProvider', function($http) {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function() {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

যেহেতু আমরা $httpপরিষেবাটিকে একটি ফাংশনে ইনজেক্ট করার চেষ্টা করছি যা configপর্যায়টির সময় কার্যকর হয় আমরা একটি ত্রুটি পেয়ে যাব:

Uncaught Error: Unknown provider: $http from services 

এই ত্রুটিটি আসলে $httpProviderযা বলছে তা হ'ল $httpপরিষেবাটি তৈরি করতে যা ব্যবহৃত হয় তা এখনও প্রস্তুত নয় (যেহেতু আমরা এখনও configপর্যায়ে রয়েছি )।

2. ইনজেকশন $httpসেবা আরম্ভের ফাংশন সেবা উইল কাজ:

//OK
angular.module('myModule').provider('myProvider', function() {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function($http) {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

যেহেতু আমরা এখন পরিষেবাটি ইনিশিয়ালাইজেশন ফাংশনে ইনজেকশন দিচ্ছি যা runএই কোডটি পর্বের সময় কার্যকর হয় ।


63
উত্তম উত্তর, তবে এটি কনফিগারেশনের সময় কীভাবে পরিষেবাগুলি ইনজেক্ট করা সম্ভব নয় তা ব্যাখ্যা করার সময় এটি কনফিগারেশনের সময় কীভাবে একটি HTTP পোষ্ট / জিইটি বানাতে হবে তা ব্যাখ্যা করে না। এটি একটি অ্যাপ্লিকেশন দ্বারা সরবরাহিত মান ব্যবহার করে কনফিগার করা অ্যাপ্লিকেশনগুলির জন্য এটি গুরুত্বপূর্ণ।
শান ও'ডেল 3:53

4
@bebraw & Kosmetika - কনফিগার পর্বের সময় আপনার কেবলমাত্র অনুরোধ করা দরকার তা হ'ল এক ধরণের সেটিংস অবজেক্ট। সম্ভবত এটিতে এপিআই এন্ডপয়েন্ট, ব্যবহারকারীর তথ্য, ব্যবহারকারীর লোকেল এবং ভাষা সেটিংস ইত্যাদি রয়েছে If আপনি কয়েকটি অ্যাপ্লিকেশন আরম্ভ করার আগে সেগুলি উপলভ্য হওয়ার জন্য কয়েকটি সেটিংস রেখে দেওয়ার জন্য আপনি সূচিপত্র html এ সার্ভার-সাইড রেন্ডারিং ব্যবহার করতে পারেন। অন্য কিছুর পরে, আমি কীভাবে এটি পোস্ট-ইন-এর মাধ্যমে করব তা বোঝার চেষ্টা করব
সান ক্লার্ক হেস

4
@ শিয়ান: কীভাবে এইচটিটিপি পোষ্ট / জিইটি তৈরি করা যায় তা ওপির (কনফিগারেশনের পর্যায়ে $ http ব্যবহার করা সম্ভব?) এর চেয়ে আলাদা প্রশ্ন এবং সম্ভবত আলাদা আলাদা পোস্টের যোগ্যতা থাকতে পারে; অ্যাংুলারের কনফিগারেশন পর্বের সিঙ্ক্রোনাস প্রকৃতির কারণে আপনার কনফিগারেশন কোডটিতে সার্ভার-সাইড ডেটা সরবরাহ করার একটি ভাল উপায় হ'ল এটি সার্ভার-সাইড রেন্ডারিংয়ের সময় আপনার HTML পৃষ্ঠায় জাভাস্ক্রিপ্ট অবজেক্ট হিসাবে রেন্ডার করা (যেমন <script>var config = <% = mySettings.toJson() %>;</script>)। এটি একটি টেম্প্লেটিং ইঞ্জিন যেমন পিএইচপি জন্য স্মার্টি, পাইথনের জন্য জিনজা 2, নোডজেএস-এর জন্য নঞ্চকস ইত্যাদি ব্যবহার করে করা যেতে পারে
ট্রেভর

4
@ থ্রিড: আপনার ক্লায়েন্ট কোডটি যদি একই সার্ভার থেকে আসে তবেই সার্ভারের এইচটিএমএল বা জেএস-তে সরাসরি কনফিগার ডেটা serোকানো কাজ করে। সিওআরএসের সাহায্যে ক্লায়েন্ট কোডটি অন্য একটি সার্ভার থেকে সরবরাহ করা, এবং পৃথক (গুলি) সার্ভার থেকে ডেটা সরবরাহ করা এখন সম্ভব (এবং খুব আকাঙ্ক্ষিত)। এই ক্ষেত্রে, আমাদের HTTP ব্যবহার করে কনফিগার ডেটা পুনরুদ্ধার করা দরকার।
বার্নার্ড

4
যদিও এটি একটি উত্তর, এটি যে প্রশ্ন করা হয়েছিল তার উত্তর নয়।
এরিক

64

এটি আপনাকে সামান্য লাভ দিতে পারে:

var initInjector = angular.injector(['ng']);
var $http = initInjector.get('$http');

তবে সতর্কতা অবলম্বন করুন, সাফল্য / ত্রুটি কলব্যাকগুলি আপনাকে অ্যাপ্লিকেশন শুরু এবং সার্ভারের প্রতিক্রিয়ার মধ্যে রেস-শর্তে রাখতে পারে।


6
"গৃহীত উত্তর" আমার সরবরাহকারীর জন্য ব্যর্থ হয়েছে ... হতাশার 2 দিনটি কোনও আশা ছাড়াই সেই কাজটি করার চেষ্টা করে কাটিয়েছি। আপনার পদ্ধতি অবিলম্বে কাজ করেছে।
ডেভ আল্পেরোভিচ

আপনি কি এখানে স্পষ্ট করে বলতে পারেন যে এখানে তৈরি করা দৃষ্টান্তটি যদি "প্রকৃত" পরিষেবা সিঙ্গলটন হয় বা কেবলমাত্র পরিষেবাটির একটি উদাহরণ যা অ্যাঙ্গুলার যখন তার প্রকৃত ইনজেক্টর যাদু করে তখন ফেলে দেওয়া হয়।
এরিক

এরিক, আমি এই মুহুর্তে এটি নিশ্চিত করতে পারি না। তবে, আমি সাধারণত যা করি (প্রযোজ্য ক্ষেত্রে) তা হ'ল angular.injector(['mymodule'])- তবে আমি নিশ্চিত নই যে আপনি $httpপরিষেবার জন্য এই পদ্ধতির ব্যবহার করতে পারবেন কিনা । আমি বলতে চাই আমার কাছে আছে। নিশ্চিত কিনা এটি সাহায্য করে বা না: - /
কোডি

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

4
আমি নিশ্চিত করেছি যে গৃহীত সমাধানটি সরবরাহকারীর মধ্যে $ http ব্যবহারের জন্য কাজ করছে না। তবে @ কোডির উত্তরটি কৌশলটি তৈরি করে
ডিনো

1

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

সমস্যাটিকে মৌলিক উপায়ে সমাধান করার পরিবর্তে, আমি যা করেছি তা বাই-পাস। এমন একটি নির্দেশিকা তৈরি করুন যা পুরো শরীরকে আবৃত করে। প্রাক্তন

<body ng-app="app">
  <div mc-body>
    Hello World
  </div>
</body>

এখন mc-bodyরেন্ডারিংয়ের আগে আরম্ভ করা দরকার (একবার), প্রাক্তন।

link: function(scope, element, attrs) {
  Auth.login().then() ...
}

Auth একটি পরিষেবা বা সরবরাহকারী, প্রাক্তন।

.provider('Auth', function() {
  ... keep your auth configurations
  return {
    $get: function($http) {
      return {
        login: function() {
          ... do something about the http
        }
      }
    }
  }
})

আমার কাছে মনে হচ্ছে বুটস্ট্র্যাপের ক্রমটিতে আমার নিয়ন্ত্রণ রয়েছে, নিয়মিত বুটস্ট্র্যাপ সমস্ত সরবরাহকারী কনফিগারেশন সমাধান করে এবং তারপরে mc-bodyনির্দেশ শুরু করার চেষ্টা করে ।

এবং এই দিকনির্দেশনাটি আমার কাছে রাউটিংয়ের আগে হতে পারে বলে মনে হয়, কারণ রাউটিংটি কোনও নির্দেশকের প্রাক্তনের মাধ্যমেও ইনজেক্ট করা হয়। <ui-route />। তবে আমি এতে ভুল হতে পারি। আরও কিছু তদন্ত প্রয়োজন।


আপনি কি দয়া করে আপনার সমাধানটি বিস্তারিতভাবে বর্ণনা করতে পারেন?
চিহ্নিত করুন

-2

আপনার প্রশ্নের "কোনও ধারণা?" এর জবাবে আমি "হ্যাঁ" দিয়ে প্রতিক্রিয়া জানাতাম। তবে অপেক্ষা করুন, আরও আছে!

আমি কনফিগারেশনে কেবল JQuery ব্যবহার করার পরামর্শ দিচ্ছি। উদাহরণ স্বরূপ:

var app = angular.module('myApp', ['services']);
app.config(['$anyProvider', function ($anyProvider) {
    $.ajax({
        url: 'www.something.com/api/lolol',
        success: function (result) {
            $anyProvider.doSomething(result);
        }
    });
}]);

success সাফল্যের কলব্যাকে কাস্টমপ্রাইডারটিতে অন্তর্ভুক্ত রয়েছে $ যেমন এটি কোনও অভ্যন্তরীণ সরবরাহকারী।
জেফ ফিশার

4
আপনি ঠিক বলেছেন যে আমার সাথে $ এবং না- of এর মিশ্রণ ছিল $ আমি এটি সকলের সাথে আপডেট হয়েছি $
সুমেরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.