2017-07-12 3 views
3

私が理解しているように、コンポーネント内のInputフィールドは一方向(親から子)であると考えられています。しかし、私はInputに渡している値を持っていますが、それをコンポーネントで変更していますが、それも親の変更に気付いています。それはオブジェクトが参照として渡されるように私にはいくらか意味がありますが、私はそれを推測しているのは、「一方向バインディング」ということは、厳密ではなく単なるパラダイムであるということですか? Angularは片方のバインドを強制するためにフードの下で何もしませんか?コンポーネント入力に値が渡されました

基本的に、私がやっている:

<session-form [values]="session"></session-form> 

session-formコンポーネントでは、私は、モーメントオブジェクトにunixtimestampからsession.startを変更します。しかし、私は親に気づき、session.startもモーメントオブジェクトです。

このようなデータを使用するためのパラダイムはありますか?変数に入力値をコピーすると、それが設定されたコンポーネントに厳密にスコープされますか?

答えて

0

はい、オブジェクトは参照渡しされます。ただし、双方向バインディングであり、オブジェクトは参照によって渡されるため、親コンポーネント内での変更も反映されるため、オブジェクトのプロパティは[(ngModel)]を使用してフォームにバインドしないでください。その代わりにFormGroupを作成し、FormBuilder.group()関数を使用してオブジェクト値を一方向に渡す必要があります。

// Inside of your child component 
@Input() myInput: SomeClass; 

form: FormGroup 

constructor(
    private formBuilder: FormBuilder 
) { }  

ngOnInit(): void { 
    this.form = this.formBuilder.group({ 
     prop1: [this.myInput.prop1], 
     // etc. 
    }); 
} 
+0

。私は '[value]'で片方向を使用しています。また、コンポーネントでFormGroupを使用していますが、フォーム外で使用するためにデータを変更する必要があります。 – RhoVisions

+0

@RhoVisions私はあなたが '[value]'で入力を片方向に渡していることを知っていますが、あなたはそれがオブジェクトへの参照だと言っていて、子コンポーネント内の双方向バインディング親コンポーネントに反映されます。 'FormGroup'はそうしないようにします。フォーム外の子コンポーネント内に双方向バインディングが必要な場合は、自分で行う必要があります。たとえば、 'private prop1:string;という名前のコンポーネント内に変数を作成し、' ngOnInit'の内部でオブジェクトの値をその変数 'this.prop1 = myObj.prop1'に代入すると、2-way – msmolcic

+0

をバインドできます@RhoVisions私は、あなたの子コンポーネントの中にある時点で '[(ngModel)]を使ってデータをフォームの外にバインドしていると仮定します。 :) – msmolcic

1

スマート/ダム(コンテナ/プレゼンテーション)コンポーネントのアーキテクチャを調べます。

基本的な考え方は、スマートコンポーネントの状態が含まれているサービスにアプリや話の状態を含んでいることです。ダムコンポーネントは、@ Inputから与えられたデータをレンダリングするだけです。スマートコンポーネントは、状態をダムコンポーネントに渡します。

代わりに、直接あなたがデータを更新するために、スマートコンポーネントを伝えるためにイベント・エミッターを使用ダムコンポーネント内のデータを更新します。この方法で一方向のデータフローが得られます。ここ

さらに詳しい情報:私は上記示したように、私は2つの結合方法を使用していない http://blog.angular-university.io/angular-2-smart-components-vs-presentation-components-whats-the-difference-when-to-use-each-and-why/

+0

情報ありがとうございます。それは面白い方法ですが、この場合は、コンポーネントを完全に別々に保つためにもっと検討しています。それは基本的にそれが好きなフォーマットに受け取るデータをフォーマットしている。私は親にそれのためのデータをフォーマットするように頼むことは意味があるとは思わない。 – RhoVisions

+0

フォーマットするだけの場合は、おそらくdate pipe:https://angular.io/api/common/DatePipeを使用できます。または、その作業を行うカスタムパイプを構築します。 – seescode

関連する問題