it-swarm.dev

استخدام http $ داخل مزود مخصص في تكوين التطبيق ، angular.js

السؤال الرئيسي - هل هو ممكن؟ حاولت بلا حظ ..

app.js الرئيسي

...
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 

أيه أفكار؟

شكر!

90
Kosmetika

خلاصة القول هي:

  • أنت {لا تستطيع حقن خدمة في قسم تهيئة الموفر .
  • أنت {CAN تضخ خدمة في القسم الذي يبدأ في تهيئة خدمة الموفر .

تفاصيل:

يحتوي الإطار الزاوي على عملية تهيئة على مرحلتين:

المرحلة 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 في وظيفة تهيئة الخدمة WILL العمل:

//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 ، ستعمل هذه الشفرة.

158
Dana Shalev

هذا قد يعطيك القليل من التأثير:

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

ولكن كن حذرًا ، فقد تجعلك عمليات معاودة الاتصال بالنجاح/الخطأ في حالة سباق بين بدء التطبيق واستجابة الخادم.

62
Cody

هذا سؤال قديم ، يبدو أن لدينا شيئًا بيضًا يدور حول ما إذا كنا نريد الاعتماد على القدرة الأساسية للمكتبة.

بدلاً من حل المشكلة بطريقة أساسية ، فإن ما فعلته هو تخطي. إنشاء توجيه يلف الجسم كله. السابق.

<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
        }
      }
    }
  }
})

يبدو لي أنني أتحكم في ترتيب bootstrap ، بعد أن يقوم bootstrap العادي بحل كل تكوين الموفر ثم حاول تهيئة التوجيه mc-body.

ويبدو أن هذا التوجيه يمكن أن يكون قبل التوجيه ، لأن التوجيه يتم حقنه أيضًا عن طريق توجيه سابق. <ui-route />. ولكن يمكن أن أكون مخطئا في هذا. يحتاج الى مزيد من التحقيق.

1
windmaomao