angular 4でアニメーションを作成しようとすると、コンポーネントでHostを使用するチュートリアルを見ました
import { Component, OnInit, HostBinding } from '@angular/core';
import { AngularFire, AuthProviders, AuthMethods } from 'angularfire2';
import { Router } from '@angular/router';
import { moveIn } from '../router.animations';
@Component({
selector: 'app-login',
templateUrl: './login.component.html',
styleUrls: ['./login.component.css'],
animations: [moveIn()],
Host: {'[@moveIn]': ''}
})
しかし、Hostプロパティの下にエラーが表示されます「[tslint] Hostプロパティの代わりに@hostBindingsと@HostListenersを使用してください」
tslint
はエラーではありません。これらは、tslintwebpackサービスによって作成されたTypeScriptリンティングメッセージです。
TSLintの詳細については、こちらをご覧ください。
https://palantir.github.io/tslint/
何らかの理由で、コンポーネントでHost
プロパティを使用することは悪い習慣であると誰かが判断しました。その機能やその他のコンポーネント構成機能を使用しても問題ありません。
このlintチェックを無効にするには、tslint.json
ファイルを編集し、以下を追加/変更します。
"use-Host-property-decorator": false
false
に設定すると、チェックが無効になります。
将来これに遭遇する人のために、なぜそれがリンティングエラーであるのか、そしてなぜまたはなぜあなたがHost
プロパティを使うべきなのかを明らかにしたいと思います。
したがって、プロパティを設定し、ホストコンポーネントでイベントをリッスンする方法はいくつかあります。コンポーネントデコレータのHost
プロパティ、または@HostBinding
(プロパティの場合)および@HostListener
(イベントの場合)。
Host
プロパティを使用する場合、テンプレートの[]
と()
とまったく同じ構文と、class
のような直接プロパティを使用できます。何もインポートする必要がなく、それを見ると何が起こるかがほぼわかるので、これは素晴らしいことです。ここで、ariaプロパティの設定など、より複雑なシナリオに入ると、これらのプロパティのロジックが複雑になります。例えば:
@Component({
selector: 'my-component',
Host: {
'[attr.aria-expanded]': 'expanded'
}
})
export class MyComponent {
expanded: boolean = false
}
ここでは、展開されたプロパティを使用して、ホストにaria-expanded
属性を設定していることがわかります。 IDE、TypeScript、LanguageExtensionsのいずれのツールを使用しても、2つがリンクされていることを確認することはできません。
これは、リファクタリングを行うときに問題を引き起こし、それらの文字列にあるロジックを見逃しました。そしてそれが起こるとき、それは本当の痛みです。
したがって、それを回避するには、@HostBinding
デコレータを使用します。
@Component({
selector: 'my-component'
})
export class MyComponent {
@HostBinding('attr.aria-expanded')
expanded: boolean = false
}
これで、プロパティの名前を好きなように変更でき、誰もが満足しています。
それは、複数のHost要素の属性に影響を与える可能性のあるプロパティ、または実際に何らかのロジックを持っているプロパティに到達するまでです。
HostBinding
@Component({
selector: 'my-component'
})
export class MyComponent {
@HostBinding('attr.aria-expanded')
@HostBinding('class.expanded')
expanded: boolean = false
}
プロパティの複数の@HostBindings
が気に入らない人もいます。そして、それは次のように変更できます。
ホスト
@Component({
selector: 'my-component',
Host: {
'[attr.aria-expanded]': 'expanded',
'[class.expanded]': 'expanded',
}
})
export class MyComponent {
expanded: boolean = false
}
そして実際にロジックを持っているプロパティ:
HostBinding
@Component({
selector: 'my-component'
})
export class MyComponent {
@HostBinding('attr.aria-expanded')
@HostBinding('class.expanded')
get expanded(): boolean {
// Don't actually do this, this is just an example for Hostbinding vs. Host
return this._expanded ? true : null
}
// create a setter here as well.
private _expanded: boolean = false
}
vs ホスト
@Component({
selector: 'my-component',
Host: {
'[attr.aria-expanded]': 'expanded ? true : null',
'[class.expanded]': 'expanded',
}
})
export class MyComponent {
expanded: boolean = false
}
これで、それぞれが何をするのかがわかったので、Host
プロパティがデフォルトでリンターによってフラグ付けされる理由について説明できます。
Host
プロパティを使用する場合、プロパティのスペルが正しいかどうかを実際に確認するためのチェックは実際にはありません。 Angular AoT(通常は本番用)を使用してビルドすると、エラーが発生する可能性が高く、修正されます。@HostBinding
を使用すると、エディターでフィードバックを取得する方が簡単です。長いビルドの進行を待つよりも(実際には、アプリケーションの大きさによって異なります)。
したがって、(今日のコンパイラでは)ほとんど不明な文字列値のため、Host
プロパティの使用にはデフォルトでフラグが付けられます。
将来、AoTを開発で使用できるようになると(Ivyレンダラーで考えますか?)、これらのコンパイラエラーが発生する可能性があります。しかし、その間、私たちはまだそこにいません。
@Reactgular post respose:
このlintチェックを無効にするには、tslint.jsonファイルを編集し、以下を追加/変更します。
"use-Host-property-decorator": false
このプロパティの名前は次のように変更されます:no-Host-metadata-propertyしたがって、tslint.jsonのコードは次のようになります。
"no-Host-metadata-property": false