1. ホーム
  2. javascript

[解決済み] アプリの設定でカスタムプロバイダ内の$httpを使用する、angular.js

2023-03-14 09:53:55

質問

主な質問 - それは可能ですか?私は運が悪いと試みました...

メイン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 

何かアイデアはありますか?

ありがとうございます。

どのように解決するのですか?

一番下の行は

  • あなたは できません プロバイダ設定セクションにサービスを注入する .
  • あなたは プロバイダのサービスを初期化するセクションに、サービスを注入することができます。 .

詳細

Angularフレームワークは、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 サービスをサービス初期化関数 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 フェーズで実行されるサービス初期化関数にサービスを注入しているので、このコードは動作します。