メッセンジャーは、ユーザーからの入力に基づいて検索結果を表示します。結果を表示しながら、検索されたWordを強調表示する必要があります。これらは、使用されているHTMLおよびコンポーネントです。
Component.html
<div *ngFor = "let result of resultArray">
<div>Id : result.id </div>
<div>Summary : result.summary </div>
<div> Link : result.link </div>
</div>
Component.ts
resultArray : any = [{"id":"1","summary":"These are the results for the searched text","link":"http://www.example.com"}]
このresultArrayは、検索テキストを入力として送信することにより、バックエンドサービスにアクセスすることから取得されます。検索テキストに基づいて、結果が取得されます。 Google検索と同様に、検索されたテキストを強調表示する必要があります。スクリーンショットを見つけてください、
「メンバー」という単語を検索すると、「メンバー」という単語の出現箇所が強調表示されます。 angular 2.を使用して同じことを達成する方法。これについてのアイデアを提案してください。
これを行うには、パイプを作成し、そのパイプをngfor
内の配列のsummary部分に適用します。 Pipe
のコードは次のとおりです。
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'highlight'
})
export class HighlightSearch implements PipeTransform {
transform(value: any, args: any): any {
if (!args) {return value;}
var re = new RegExp(args, 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.
return value.replace(re, "<mark>" + args + "</mark>");
}
}
そして、マークアップで次のような文字列に適用します:
<div innerHTML="{{ str | highlight : 'search'}}"></div>
「検索」を強調表示する単語に置き換えます。
これが役立つことを願っています。
選択した回答には次の問題があります。
代わりに次のコードをお勧めします
transform(value: string, args: string): any {
if (args && value) {
let startIndex = value.toLowerCase().indexOf(args.toLowerCase());
if (startIndex != -1) {
let endLength = args.length;
let matchingString = value.substr(startIndex, endLength);
return value.replace(matchingString, "<mark>" + matchingString + "</mark>");
}
}
return value;
}
InnerHTMLメソッドの難点の1つは、<mark>
鬼ごっこ。別の方法は、これをコンポーネントに配置して、スタイリングのオプションを大幅に増やすことです。
highlighted-text.component.html
<mark *ngIf="matched">{{matched}}</mark>{{unmatched}}
highlighted-text.component.ts
import { Component, Input, OnChanges, OnInit } from "@angular/core";
@Component({
selector: "highlighted-text",
templateUrl: "./highlighted-text.component.html",
styleUrls: ["./highlighted-text.component.css"]
})
export class HighlightedTextComponent implements OnChanges {
@Input() needle: String;
@Input() haystack: String;
public matched;
public unmatched;
ngOnChanges(changes) {
this.match();
}
match() {
this.matched = undefined;
this.unmatched = this.haystack;
if (this.needle && this.haystack) {
const needle = String(this.needle);
const haystack = String(this.haystack);
const startIndex = haystack.toLowerCase().indexOf(needle.toLowerCase());
if (startIndex !== -1) {
const endLength = needle.length;
this.matched = haystack.substr(startIndex, endLength);
this.unmatched = haystack.substr(needle.length);
}
}
}
}
highlighted-text.component.css
mark {
display: inline;
margin: 0;
padding: 0;
font-weight: 600;
}
使用法
<highlighted-text [needle]=searchInput [haystack]=value></highlighted-text>
文字列に複数の単語がある場合は、配列を受け入れるパイプを使用し、結果の各単語を強調表示します。
複数の検索語に対して次のパイプを使用できます。
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'highlight'
})
export class HighlightText implements PipeTransform {
transform(value: any, args: any): any {
if (!args) {return value;}
for(const text of args) {
var reText = new RegExp(text, 'gi');
value = value.replace(reText, "<mark>" + text + "</mark>");
//for your custom css
// value = value.replace(reText, "<span class='highlight-search-text'>" + text + "</span>");
}
return value;
}
}
ストリングを分割して、ストリングの配列を生成します。
var searchTerms = searchKey.split(' ');
使用法:
<div [innetHTML]="result | highlight:searchTerms"></div>
カスタムクラスを使用する場合:
.highlight-search-text {
color: black;
font-weight: 600;
}
ではごきげんよう!
カマルの答えを拡大するには、
変換メソッドに入力される値は数値である可能性があり、おそらく文字列String(value)
へのキャストが安全なことです。
transform(value: string, args: string): any {
if (args && value) {
value = String(value); // make sure its a string
let startIndex = value.toLowerCase().indexOf(args.toLowerCase());
if (startIndex != -1) {
let endLength = args.length;
let matchingString = value.substr(startIndex, endLength);
return value.replace(matchingString, "<mark>" + matchingString + "</mark>");
}
}
return value;
}