Angular/文章内の文字列にリンクを付加する

Angular-Materialの<mat-form-field> 

<mat-form-field>は、いくつかのAngular Materialコンポーネントをラップし、下線、フローティングラベル、ヒントメッセージなどの一般的なテキストフィールドスタイルを適用するために使用されるコンポーネントです。<mat-form-field>がラップしているコンポーネント
 <input matNativeControl>
 <textarea matNativeControl>
 <select matNativeControl>
 <mat-select>
 <mat-chip-list>

フォームフィールドにネイティブの<input>または<textarea>要素が含まれている場合は、それにmatInputディレクティブを追加し、MatInputModuleをインポートしていることを確認してください。フォームフィールドコントロールとして機能できるその他のコンポーネントには、<mat-select>、<mat-chip-list>、および作成したカスタムフォームフィールドコントロールが含まれます。matInputは、ネイティブの<input>要素と<textarea>要素が<mat-form-field>と連携できるようにするディレクティブです。
<input>および<textarea>属性
通常の<input>要素と<textarea>要素で使用できるすべての属性は、<mat-form-field>内の要素でも使用できます。これには、ngModelやformControlなどのAngularディレクティブが含まれます。(type属性は1つのみ)


ディレクティブ(プログラミングにおける指示)

Angular には2種類の組み込みディレクティブがあります。属性 ディレクティブと構造 ディレクティブです。

属性ディレクティブ

他の HTML 要素、属性、プロパティ、コンポーネントの 動作をリッスンして変更します。 それらは通常、HTML の属性であるかのように要素に適用されます。 NgModule では独自の属性ディレクティブを定義しています。

NgClass - CSS クラスを追加および削除
NgStyle - HTML スタイルを追加および削除
NgModel - HTML の form 要素への双方向データバインディング

構造ディレクティブ

 HTML レイアウトを担当します。 ホスト要素に対する追加、削除、加工といった、 DOM 構造の形成、または再形成を行います。

NgIf—条件に応じてテンプレートからサブビューを作成、破棄。
NgFor—リストの各項目に対してノード繰り返し。
NgSwitch—いくつかのビューから選んで表示。


[(ngModel)]: 双方向バインディング 


NgModel ディレクティブを使うと、データプロパティを表示したり、 ユーザー操作に応じてプロパティを更新したりすることができます。

前)
<label for="without">without NgModel:</label>
<input [value]="currentItem.name"
 (input)="currentItem.name=$event.target.value" id="without">
後)
<label for="example-change">(ngModelChange)="...name=$event":</label>
<input [ngModel]="currentItem.name"
 (ngModelChange)="currentItem.name=$event" id="example-change">

ngModel データプロパティは要素の値プロパティを設定し、 ngModelChange イベントプロパティは要素の値の変更をリッスンします。

thanks


文章内の文字列にリンクを付加する

古い?

↓こっちが正解?

Webアプリケーション脆弱性に対する Angularでの対応

import { Component } from '@angular/core';

@Component({
 selector: 'app-root',
 template: `
 <h1>Security</h1>
  <app-bypass-security></app-bypass-security>
 `
})
export class AppComponent {
}
bypass-security.component.ts

import { Component } from '@angular/core';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser';

@Component({
 selector: 'app-bypass-security',
 templateUrl: './bypass-security.component.html',
})
export class BypassSecurityComponent {
 dangerousUrl: string;
 trustedUrl: SafeUrl;

 constructor(private sanitizer: DomSanitizer) {
   this.dangerousUrl = 'https://angular.jp/guide/dynamic-component-loader';
   this.trustedUrl = sanitizer.bypassSecurityTrustUrl(this.dangerousUrl);
 }
}
bypass-security.component.html

<p><a [href]="trustedUrl" target="_blank" rel="noopener noreferrer">
 Click me</a></p>


補間 {{...}} Interpolation

Angular が最初に 評価 してから 文字列に変換する テンプレート式です。
Angular が プロパティバインディング に変換する特別な構文です。

<p>{{title}}</p>
<div><img src="{{itemImageUrl}}"></div>
<h3>Current customer: {{ currentCustomer }}</h3>

<p>The sum of 1 + 1 is {{1 + 1}}.</p>

{{...}}内のテキストは、多くの場合、コンポーネントのプロパティ名です。title プロパティと itemImageUrl プロパティを評価して空白を埋めます。Angular は、二重中括弧内のすべての式を評価し、式の結果を文字列に変換して、 それらを隣接するリテラル文字列とリンクします。 最後に、この合成補間の結果を 要素またはディレクティブのプロパティ に割り当てます。


テンプレート式 

テンプレート 式 は値を生成し、 {{ }} 内に表示します。 Angularは 式を実行し、それをバインディングターゲットのプロパティに割り当てます。 ターゲットは HTML 要素、コンポーネント、またはディレクティブです。

{{1 + 1}} 内の1 + 1 はテンプレート式 です。 プロパティバインディングでは、[property]="expression" のように、テンプレート式は = 記号の右側の引用符で囲まれます。

<h4>{{recommended}}</h4>
<img [src]="itemImageUrl2">

<ul>
 <li *ngFor="let customer of customers">{{customer.name}}</li>
</ul>

<label>Type something:
 <input #customerInput>{{customerInput.value}}
</label>

テンプレート入力変数 let customer
テンプレート参照変数 (#var):
ハッシュ記号 (#) を使うことで参照変数を宣言できます。 <input> を参照する customerInput 変数を宣言します。


セレクター

すべてのコンポーネントにはCSSセレクターが必要です。セレクターは、テンプレートHTMLで対応するタグが見つかると、このコンポーネントをインスタンス化するようにAngularに指示します。

たとえば、セレクターをapp-hello-worldとして定義するコンポーネントhello-world.component.tsについて、このセレクターは、テンプレート内のタグ<app-hello-world>がいつでもこのコンポーネントをインスタンス化するようにangularに指示します。

テンプレート

AngularのHTMLテンプレート。 HTMLのセクションであり、ブラウザが表示するページの一部分として含めることができます。 

<app-big-hero-detail
   (deleteRequest)="deleteHero($event)"
   [hero]="currentHero">
</app-big-hero-detail>
@Component({
 selector: 'app-big-hero-detail',
 template: `
 <div class="detail">
   <img src="{{heroImageUrl}}">
   <div><b>{{hero?.name}}</b></div>
   <div>Name: {{hero?.name}}</div>
   <div>Emotion: {{hero?.emotion}}</div>
   <div>Birthdate: {{hero?.birthdate | date:'longDate'}}</div>
   <div>Web: <a href="{{hero?.url}}" target="_blank">{{hero?.url}}</a></div>
   <div>Rate/hr: {{hero?.rate | currency:'EUR'}}</div>
   <br clear="all">
   <button (click)="delete()">Delete</button>
 </div>
 `,
 styles: [`
   .detail { border: 1px solid black; padding: 4px; max-width: 450px; }
   img     { float: left; margin-right: 8px; height: 100px; }
 `]
})
export class BigHeroDetailComponent extends HeroDetailComponent {

 @Input()  hero: Hero;
 @Output() deleteRequest = new EventEmitter<Hero>();

 delete() {
   this.deleteRequest.emit(this.hero);
 }
}

文字列置換例

古い

   var re_url = /((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi;
   var re_mail = /((?:\w+\.?)*\w+@(?:\w+\.)+\w+)/gi;

   s = s.replace(re_url, '<a href="$1" target="_blank">$1</a>');
   s = s.replace(re_mail, '<a href="mailto:$1">$1</a>'); 

いまは、string.link()で文字にリンクを設定することができます。


cc