2016-08-09 3 views
5

私はAngularを初めて使用しています。私はconfigブロックを勉強しており、モジュールのブロックを実行しています。プロバイダとインスタンスの違いは何ですか?

コードの下を見ていてください:あなたはそれが書かれているconfigブロックで見ることができるように

angular.module('myModule', []). 
config(function(injectables) { // provider-injector 
// This is an example of config block. 
// You can have as many of these as you want. 
// You can only inject Providers (not instances) 
// into config blocks. 
}). 
run(function(injectables) { // instance-injector 
// This is an example of a run block. 
// You can have as many of these as you want. 
// You can only inject instances (not Providers) 
// into run blocks 
}); 

を:「あなただけのプロバイダ(いないインスタンス)を注入することができます」。

これはどういう意味ですか?誰もプロバイダとインスタンスの違いを教えてください。

答えて

4

。非常に簡単にするため、Angular JSでサービスを定義して機能を実現しています。プロバイダは、サービスの動作方法を設定する方法の1つです。 Angular JSには、値、定数、ファクトリ、サービス、デコレータといった概念がいくつかあります。これは、さまざまな方法でサービスを傍受するのに役立ちます。以下のリンクをご確認ください。バックプロバイダに来る

https://docs.angularjs.org/guide/providers

、彼らがさえアプリケーションが起動する前に実行する必要があるアプリケーションの広い構成を定義するために使用されています。 configブロックはAngular JSモジュールがロードされる前に実行されるので、その下にプロバイダを設定します。その時点までにモジュールがロードされていないため、configブロック内のサービスにアクセスすることはできません。

実行ブロックは、すべてのモジュールが$ injectorによってロードされた後に実行されます。ランブロックを入力すると、サービスがロードされるので、プロバイダをもう設定できなくなります。これが、実行ブロック内のプロバイダにアクセスできない理由です。

例を見てみましょう。私は、ユーザーと管理者の両方の画面をサポートするようにアプリケーションを設計しました。しかし、それらに関連する機能はそれぞれのサービスで定義されています。私はユーザーがログインするときに適切なサービスだけをロードしたいと思っています。

定義rolesProvider

myApp.provider("roles", function rolesProvider(){ 
var role; 
this.setRole = function(value) { 
role = value; 
} 

this.$get = function rolesFactory() { 
if(role === "user") { 
return new userRole(); 
} else { 
return new adminRole(); 
} 
} 
}); 

設定rolesProviderアプリケーションがキックオフ時にユーザー

myApp.config(["rolesProvider"], function(rulesProvider){ 
rulesProvider.setRole("user"); 
}); 

として私のアプリケーションはユーザーとしてではなく、管理者として実行するように設定されます。

さらに詳しい説明が必要な場合は教えてください。

+0

ありがとうございました。私の理解を助けました。 – RajSharma

+0

ようこそ。 –

0

このポストから盗まれました:AngularJS: Service vs provider vs factory - 角度のある利用可能なさまざまなタイプのプロバイダの役割をよりよく理解するためには、必ず読んでおく価値があります。

しかし、注入前にGreeterクラスを設定する場合はどうすればよいですか?その後、我々は、例えば

を書くことができます:

provide.provider('greeter2', function() { 
    var salutation = 'Hello'; 
    this.setSalutation = function(s) { 
    salutation = s; 
} 

    function Greeter(a) { 
    this.greet = function() { 
     return salutation + ' ' + a; 
    } 
    } 

    this.$get = function(a) { //When injected into a controller or service, this is what will get called. 
    return new Greeter(a); 
    }; 
}); 

次に、あなたがそうのような上記を設定することができます:実際にあなたの質問が良い

angular.module('abc', []).config(function(greeter2Provider) { //Provider injected 
    greeter2Provider.setSalutation('Halo'); 
}); 

function Controller(greeter2) { //Accessing the actual service exposed by the provider.$get 
    expect(greeter2.greet()).toEqual('Halo 123'); 
} 
0

クイックアンサー:プロバイダはインスタンスを作成します。彼らがそうするまで、それらをconfig()ブロックで使うことができます。起動時にURLエンドポイントを変更するデータプロバイダにとって非常に便利です。

しかし、new Something()を実行する前に、「プロバイダープロバイダー」のセクションで設定コードを実行できます。

サービス・サービス、サービス・ファクトリー、サービス値はすべてプロバイダー定義のショートカットですが、構成部分をユーザーから隠すだけで、オブジェクトのインスタンス化(new Something()を使用)にはまっすぐです。

関連する問題