[解決済み] Angular 2のコンポーネント間でデータを共有するにはどうすればよいですか?
質問
Angular 1.x.xでは、単純に同じサービスを要求すると同じインスタンスになり、サービス内のデータを共有することが可能です。
Angular 2では、私のサービスへの参照を持つコンポーネントがあります。サービス内のデータを読み、修正することができ、それは良いことです。別のコンポーネントに同じサービスを注入しようとすると、まるで新しいインスタンスを取得したかのように見えます。
私は何を間違えているのでしょうか?パターン自体が間違っているのか(データを共有するためにサービスを使用する)、それともサービスをシングルトン(アプリの1つのインスタンス内)としてマークする必要があるのか、それとも何か?
私は
2.0.0-alpha.27/
をする
を通してサービスをインジェクトしています。
appInjector
(編集: 現在
providers
) の中に
@Component
アノテーションを作成し、コンストラクタで参照を保存します。これはコンポーネント内でローカルに動作しますが、私が考えていたように、コンポーネント間で動作しません(同じサービスインスタンスを共有しません)。
アップデイト
: Angular 2.0.0から@ngModuleが追加されました。
providers
プロパティでサービスを定義します。
@ngModule
. これにより、そのモジュール内の各コンポーネントやサービスなどに、そのサービスの同じインスタンスが渡されるようになります。
https://angular.io/docs/ts/latest/guide/ngmodule.html#providers
アップデイト : AngularやFE開発全般に言えることですが、色々なことがありました。@noririco さんがおっしゃるように、NgRxのような状態管理システムを使うのも手です。 https://ngrx.io/
どのように解決するのですか?
サービスのシングルトンは良い解決策です。他の方法 -
data/events bindings
.
両者の例です。
class BazService{
n: number = 0;
inc(){
this.n++;
}
}
@Component({
selector: 'foo'
})
@View({
template: `<button (click)="foobaz.inc()">Foo {{ foobaz.n }}</button>`
})
class FooComponent{
constructor(foobaz: BazService){
this.foobaz = foobaz;
}
}
@Component({
selector: 'bar',
properties: ['prop']
})
@View({
template: `<button (click)="barbaz.inc()">Bar {{ barbaz.n }}, Foo {{ prop.foobaz.n }}</button>`
})
class BarComponent{
constructor(barbaz: BazService){
this.barbaz = barbaz;
}
}
@Component({
selector: 'app',
viewInjector: [BazService]
})
@View({
template: `
<foo #f></foo>
<bar [prop]="f"></bar>
`,
directives: [FooComponent, BarComponent]
})
class AppComponent{}
bootstrap(AppComponent);
関連
-
[解決済み] コンストラクタとngOnInitの違いについて
-
[解決済み] TypeScriptで文字列を数値に変換する方法とは?
-
[解決済み] Angular HTMLバインディング
-
[解決済み] Angularのルーティングされたコンポーネントにデータを渡すにはどうしたらいいですか?
-
[解決済み】PromiseとObservablesの違いは何ですか?
-
[解決済み] Angular 2におけるEventEmitter.next()とEventEmitter.emit()の相違点
-
[解決済み] angular 2 (npm)を最新版に正しくアップグレードするにはどうしたらいいですか?
-
[解決済み] RxJSのmap演算子でエラーを出す方法 (angular)
-
[解決済み] angularで「タイプ 'EventEmitter' は一般的ではありません」ERROR。
-
[解決済み] Angular 2+でspec.tsファイルなしでComponentを生成する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 継承と依存性注入
-
[解決済み] Angularでコンポーネントをリフレッシュする方法
-
[解決済み] Angular CLIで特定のバージョンのAngularをインストールするには?
-
[解決済み] Angularで、コントロールが作成された後、FormControlにバリデータを追加する方法は?
-
[解決済み] 文字列|ヌル'型の引数は、文字列'型のパラメータに代入できません。タイプ 'null' はタイプ 'string' に割り当てられません。
-
[解決済み] 新しいangularプロジェクトを作成する際に依存関係ツリーエラーを解決できない
-
[解決済み] 遅延のあるobservableを作成するには?
-
[解決済み] Reactive Forms - フィールドをタッチしたものとしてマークする
-
[解決済み] angular-cli が HTTPS で ng serve するようにする。
-
[解決済み] Angularアプリケーションに複数のHTTPインターセプターを追加する