properties
内で設定する、reflectToAttribute
についてまとめます。
まず、以下のようにカスタムエレメントの属性値にraised
があります。
<indicator-button raised></indicator-button>
これは、type: Boolean
において、raised="true"
と同じ意味になります。以下のように属性値を消すとfalse
になります。
<indicator-button></indicator-button>
Polymerでは、以下のように設定しています。
static get properties () {
return {
raised: {
type: Boolean,
reflectToAttribute: true,
value: false,
observer: '_calculateElevation'
}
};
}
_calculateElevation() {
this.raised = false;
}
raised
プロパティに値が渡させれると、observer: '_calculateElevation'
として設定している_calculateElevation
メソッドが発火して、raised
の値をfalse
にします。
さて本題のreflectToAttribute: true
についてですが、公式サイトによると以下のように説明されています。
ある特定のケースにおいては、HTMLの属性値とプロパティ値を同期させておくと便利かもしれません。propertiesオブジェクト内のプロパティにreflectToAttribute: trueを設定することで実現できます。これによって、プロパティに対する監視可能な変更は、同名の属性にシリアライズされます。
※翻訳された滝口さん記事より引用
実際に、プロパティにてreflectToAttribute: true
を指定して、raised
キーにtrue
を指定してから、HTMLソースを確認すると以下のようになります。
raised
プロパティがついていることがわかります。
次に、_calculateElevation
メソッドによって、this.raised = false;
にしてから、HTMLソースを確認すると以下のようになります。
raised
プロパティが無くなっていることがわかります。
次に、reflectToAttribute: false
にしてから、_calculateElevation
メソッドの、this.raised = false;
を通してHTMLソースを確認すると以下のようになります。
this.raised = false;
を設定しているのに、raised
プロパティが消えていないことがわかります。つまり、Polymerで設定した値とHTMLソースが同期されていないことがわかります。
まとめ
reflectToAttribute
プロパティをtrue
に設定すると、Polymerのプロパティと、HTMLタグの属性値を同期させることが出来るようになります。