Angular 2コンポーネントのプロパティのデフォルト値を設定するにはどうすればよいですか?


93

Angular 2.0コンポーネントを作成するとき、プロパティのデフォルト値をどのように設定しますか?

たとえば、デフォルトでに設定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>

コンソールに記録:

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

コンソールに記録:

'bar'
undefined
undefined

やってみるとどうなる?
JBニゼット2016年

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

6
私は現在問題に直面しておらず、意図された動作の明確化を求めています。私の好奇心に対する答えが見つからなかったとき、私は他の人が同じように明快さを求めている場合に備えて質問をすることにしました。
ブライアンレイナー2016年

あなたの例では、@ Input()の括弧が抜けています
kitimenpolku

回答:


130

それは興味深いテーマです。あなたはそれがどのように動作するかを理解するために、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に含まれるコンポーネント

その結果、コンソールに次のように表示されます。 Init default

つまり、onChangeトリガーされなかったということです。初期化がトリガーされ、property値はdefault期待どおりです。

状況2

プロパティが設定されたHTMLに含まれるコンポーネント <cmp [property]="'new value'"></cmp>

その結果、コンソールに次のように表示されます。

Changed new value Object {}

Init new value

そして、これは面白いです。まず、トリガされたonChangesettedフック、propertyにしnew valueて、前の値となった空のオブジェクト!そして、そのonInitフックがの新しい値でトリガーされた後にのみproperty


8
この動作に関する公式ドキュメントへのリンクはありますか?これの背後にあるロジックと推論を理解し、バージョンごとの動作を追跡できるようにするとよいでしょう。
ブライアンレイナー

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

1
私は@Inputデフォルト値を持っていることに関するドキュメントを探していました。@slicepanにはコンポーネントライフサイクルのドキュメントへのリンクがありますが、ドキュメントで使用されているデフォルト値が表示されませんでした。
nycynik 2018年

@nycynik単にデフォルト値のためにこれを使用します@Input() someProperty = 'someValue';
magikMaker

1
あなたは命の恩人です。AngularJSアプリからAngular 7.xへのアップグレード中に頭が痛くなりました
Andris

8

これに最適なソリューションを次に示します。(ANGULAR 7、8、9)

対処法@Input変数のデフォルト値設定します。場合は何も値が渡されないという入力変数に、それはデフォルト値をとります

私はこの種の同様の質問に対する解決策を提供しました。あなたはここから完全な解決策を見つけることができます

export class CarComponent implements OnInit {
  private _defaultCar: car = {
    // default isCar is true
    isCar: true,
    // default wheels  will be 4
    wheels: 4
  };

  @Input() newCar: car = {};

  constructor() {}

  ngOnInit(): void {

   // this will concate both the objects and the object declared later (ie.. ...this.newCar )
   // will overwrite the default value. ONLY AND ONLY IF DEFAULT VALUE IS PRESENT

    this.newCar = { ...this._defaultCar, ...this.newCar };
   //  console.log(this.newCar);
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.