38

親コンポーネントを子コンポーネントに挿入しようとしています。これは簡単だと思いました。子の .xml ファイルに親コンポーネントを指定/挿入するだけですconstructor()

constructor(private _parent:AppComponent) {}   // child component constructor

次のエラーが表示されます。

例外: ChildComponent(?) のすべてのパラメーターを解決できません。すべてに有効な型または注釈があることを確認してください。

私は何が欠けていますか?

子コンポーネント:

import {Component} from 'angular2/core';
import {AppComponent} from './app.component';

@Component({
  selector: 'child',
  template: `<p>child</p>`
})
export class ChildComponent {
  constructor(private _parent:AppComponent) {}
}

アプリ コンポーネント:

import {Component} from 'angular2/core';
import {ChildComponent} from './child.component';

@Component({
  selector: 'my-app',
  template: `{{title}} <child></child>
  `,
  directives: [ChildComponent]
})
export class AppComponent {
  title = "Angular 2 - inject parent";
  constructor() { console.clear(); }
}

プランカー

4

2 に答える 2

50

答えについては、 @EricMartinez のコメントを参照してください。問題は、A が B をインポートし、B が A をインポートする場合の循環参照のようです。

Eric の plunkerにある 1 つのファイルの代わりに 2 つのファイルを使用するplunkerを次に示します。

元のプランカーからの唯一の変更点は、ChildComponent にあります。

import {Component, Inject, forwardRef} from 'angular2/core';
// ....
constructor(@Inject(forwardRef(() => AppComponent)) private _parent:AppComponent)

A と B はまだ相互にインポートしているため、これで循環参照がなくなるかどうかはわかりませんが、うまくいくようです。

Miško が述べているhttps://github.com/angular/angular/issues/3216も参照してください。

この [forwardRef() を使用したユーザーフレンドリーではない宣言] は、JS の制限であり、関数宣言の巻き上げ方法です。循環依存関係があるときはいつでも必要になりますforwardRef:-(私はそれの周りに離れているのを見ません.

あなたの親が子供について知る必要があり、子供が親について知る必要があるという状況に陥るべきではないと私は主張します. @Queryほとんどのユースケースを処理する必要があります。

申し訳ありませんが、まれなケースでこれが苦痛になることには同意しますが、解決策が見当たらないため、この問題は対処できず、クローズされます。

うーん...私が親に注入しようとした理由は、子供が親と通信する2つの方法を見たからです:

  1. 子は出力プロパティを定義し、親がサブスクライブするイベントを発行します
  2. 子は親を注入し (たとえば、ペインはタブを注入する場合があります)、親のメソッドを呼び出すことができます

そして、各アプローチをいつ使用するかを決定しようとしていました。Miško は 2. のように聞こえます。

更新:これについてもう少し考えていました... 1.子と親の間の結合が少ないため、より優れています。1. の場合、子は親の公開 API/インターフェースを知る必要はありません (おそらく知る必要はありません)。
逆方向 (たとえば、親が@ViewChild(@Queryは現在非推奨) を使用して子への参照を取得し、子のメソッドを呼び出す) では、親が子コンポーネントを使用しているため、カップリングはうまくいきます。子のパブリック API/インターフェース: つまり、入力および出力プロパティとパブリック メソッド。

于 2015-12-31T04:06:25.840 に答える