2016-03-17 20 views
18

Angular 2.0コンポーネントを記述するとき、プロパティのデフォルト値はどのように設定されますか?角度2コンポーネントのプロパティのデフォルト値を設定するにはどうすればよいですか?

たとえば、デフォルトではfooを 'bar'に設定したいが、バインディングはすぐに 'baz'に解決される可能性があります。ライフサイクルフックではどのようにこのことが起こりますか?

@Component({ 
    selector: 'foo-component' 
}) 
export class FooComponent { 
    @Input() 
    foo: string = 'bar'; 

    @Input() 
    zalgo: string; 

    ngOnChanges(changes){ 
      console.log(this.foo); 
      console.log(changes.foo ? changes.foo.previousValue : undefined); 
      console.log(changes.foo ? changes.foo.currentValue : undefined); 
    } 
} 

次のテンプレートがあると、これは私が期待する値です。私が間違っている?

<foo-component [foo] = 'baz'></foo-component> 

Logged to console: 
'baz' 
'bar' 
'baz' 

<foo-component [zalgo] = 'released'></foo-component> 

Logged to console: 
'bar' 
undefined 
undefined 
+0

試してみるとどうなりますか? –

+1

@BryanRayner現在のコンソールの印刷方法は正しいです。あなたが直面している問題は何ですか? –

+4

私は現在、問題に直面していない、意図した動作の明確化を求めている。私の好奇心に対する答えが見つからなかったとき、私は他の人が明快に同じ希望を持っている場合に質問をすることにしました。 –

答えて

19

これは興味深いテーマです。 2つのライフサイクルフックで再生して、動作の仕方を把握することができます:ngOnChangesngOnInit

基本的にデフォルト値をInputに設定すると、そのコンポーネントに値が入力されない場合にのみ使用されます。 興味深い部分は、コンポーネントが初期化される前に変更されます。

2つのライフサイクルフックと1つのプロパティがinputから来るようなコンポーネントがあるとします。

@Component({ 
    selector: 'cmp', 
}) 
export class Login implements OnChanges, OnInit { 
    @Input() property: string = 'default'; 

    ngOnChanges(changes) { 
    console.log('Changed', changes.property.currentValue, changes.property.previousValue); 
    } 

    ngOnInit() { 
    console.log('Init', this.property); 
    } 

} 

状況1

コンポーネントが定義されてproperty値なしにHTMLに含まれて私たちは、コンソールに表示される結果

onChangeがトリガされていなかった平均値です Init default

。 Initがトリガーされ、propertyの値はdefaultになります。

状況2

コンポーネントはsettedプロパティでHTMLに含まれて私たちは、コンソールに表示される結果<cmp [property]="'new value'"></cmp>

Changednew valueObject {}

Initnew value

これは面白いです。最初にonChangeフックが起動され、propertyからnew valueに設定され、以前の値はの空のオブジェクトでした。その後、propertyという新しい値でonInitフックがトリガされただけです。

+2

この動作のための公式ドキュメントへのリンクはありますか?この背後にある論理と推論を理解し、バージョンごとに何が動作しているかを追跡することもできます。 –

+0

私はそのような情報を見たことがない、上記のすべてが私自身の調査です。私はあなたがコンパイルされたjsファイルを読むならもっと答えを見つけることができると思います – Mikki

+1

文書はこちら[こちら](https://angular.io/guide/lifecycle-hooks) – Slicedpan

関連する問題