[解決済み] Angular 2のコンポーネントプロパティにデフォルト値を設定する方法は?
質問
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
解決方法は?
それは興味深いテーマですね。
2つのライフサイクルフックを使って、それがどのように機能するかについて遊ぶことができます。
ngOnChanges
と
ngOnInit
.
基本的に、デフォルト値を
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
コンポーネントが定義されていない状態でhtmlに含まれている
property
値
その結果、コンソールに表示されます。
Init default
つまり
onChange
はトリガーされませんでした。Initがトリガーされ
property
の値が
default
は期待通りです。
シチュエーション2
htmlに含まれるコンポーネントで、プロパティが設定されているもの
<cmp [property]="'new value'"></cmp>
その結果、コンソールに表示されます。
Changed
new value
Object {}
Init
new value
そして、これが面白いんです。まず最初にトリガーされたのは
onChange
フックが設定され、それが
property
から
new value
であり、以前の値は
空オブジェクト
! そして、その後に
onInit
の新しい値でフックがトリガーされました。
property
.
関連
-
[解決済み】Angular2 CLI エラー "@angular/compiler-cli" パッケージが正しくインストールされていません。
-
[解決済み】アンギュラーコンポーネントにサービスを注入しようとするとエラー "EXCEPTION: Can't resolve all parameters for component"、なぜ?
-
[解決済み] TypeScript で `window` に新しいプロパティを明示的に設定するにはどうすればよいですか?
-
[解決済み] コンポーネントテンプレートで要素を選択するには?
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] Angularプロジェクトごとに生成される膨大な数のファイル
-
[解決済み] Angularの@Directiveと@Componentの比較
-
[解決済み] Angular 2の "select "で新しい選択範囲を取得するにはどうすればよいですか?
-
[解決済み] AngularでNameServiceのプロバイダがない
-
[解決済み] Angular - すべてのリクエストにヘッダを設定する
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】ERR_INVALID_HTTP_RESPONSEをAngular 7とASP.Net Core 2.2を使ってGoogle Chromeブラウザーで使用する場合
-
[解決済み】serveコマンドを使用するには、angular-cliプロジェクト内にいる必要があります。
-
[解決済み] Angular "未定義のプロパティ 'subscribe' を読み取ることができません".
-
[解決済み] ng serve または firebase serve を終了させる方法
-
[解決済み] NgModule が見つかりませんでした。NgModule でのインポートをスキップするには skip-import オプションを使用します。
-
[解決済み] Angular 8 NgForはArray errorやAcces Control Allow originなどのIterableへのバインディングのみをサポートしています。
-
[解決済み] "rxjs" observable.throw は関数ではありません - Angular4
-
[解決済み] パーサエラーです。式が期待される場所で補間({{}})を得た
-
[解決済み] Angular2 Selectorが、ネストしたComponentのどの要素にもマッチしない。
-
[解決済み] Angularで電話番号の入力をフォーマットする