2017/08/30
余計なタグとは
下記のようなテンプレートがあったとします。
//<my-msg>コンポーネント
<div>{{msg}}</div>
//使う
<my-msg [msg]="'はろー'"></my-msg>
reactやvue.jsの場合以下のように出力されます。
<div>はろー</div>
しかしAngularの場合は以下のように出力されます。
<my-msg><div>はろー</div></my-msg>
つまり余計なタグとは<my-msg>など独自コンポーネントのセレクターの事です。
一般的な場合の回避方法
selectorをdiv[myMsg]と指定し、テンプレートを以下のようにすることで回避する事が出来ます。
//定義
{{msg}}
//使用
<div myMsg [msg]="'はろー'"></div>
しかし、この方法はASTの再起では使えません。
(正確には使えないことはないがNodeの種類^2コピペしないといけないのでしたくない)
解決方法
ng-templateとngTemplateOu
2017/04/01
解決法
innerHTMLに設定するHTMLはデフォルトでサニタイズされるようになっており、iframeタグが自動的に除去されるのが原因でした。
サニタイズされるのはjavascriptだけだと思っていましたが、iframeも駄目みたいです。
import { DomSanitizer } from '@angular/platform-browser';
constructor(private sanitizer: DomSanitizer) {}
let innerHTML = this.sanitizer.bypassSecurityTrustHtml(html);
注意
サニタイズすると、iframeだけではなくjavascriptも埋め込み可能になるのでXSSには注意して下さい。
参考
Security - GUIDEDomSanitizer - API