단락에서 간단한 지시로 텍스트를 강조하다
18259 단어 webdevtypescripttutorialangular
텍스트 강조 표시
다음은 우리가 본문에서 세울 내용이다.Angular에는 매우 간단하고 직접적인 하이라이트 명령이 있습니다.우리는 크롬 개발 도구에서 유사한 것을 보았다.
이 생각은 매우 간단하다.검색어에 일치하고 일치하는 텍스트를
span
또는 mark
ref 표시에 어떤 방식으로 포장하면 나중에 필요에 따라 스타일 설정을 할 수 있습니다.일치하는 텍스트를 어떻게 강조 표시합니까?
우리는
Regex
단락에서 일치하는 항목을 찾을 것입니다.정규 표현식은 문자열에서 이런 조작을 실행하는 것을 매우 간단하게 한다.이상적인 경우, 명령은 텍스트를 포함하는 요소에만 추가되어야 한다.이것이 바로 우리가 건설하고 있는 것이다.
그러니까 우리 지령을 계획해 보자.
지령의 주요 입력은 강조해야 할 용어다.그래서 우리는
@Input()
를 사용하여 이 용어를 우리의 지령에 전달할 것이다.나는 이것이 바로 우리가 지령에 필요한 것이라고 생각한다.그래서 지금 우리는 검색할 실제 단락을 찾아야 한다.따라서
HTMLElement
에서 텍스트를 얻을 수 있는 간단한 방법이 있다.우리는 textContent
ref 를 사용하여 텍스트를 검색할 수 있다.Highlight 명령 작성
예전과 같이, 명령어를 위한 새 모듈만 만드는 것을 권장합니다.만약 당신이 정말로 코드 라이브러리를 정확하게 관리한다면, 프로젝트에 라이브러리를 만드는 것도 고려할 수 있다.
간단히 보기 위해 코드는
lib
폴더에 배치합니다.lib/
├── highlight/
│ ├── highlight.module.ts
│ ├── highlight.directive.ts
강조 표시 모듈
이 모듈은 우리의 지령을 간단하게 설명하고 내보낼 것이다.여기는 아무것도 필요 없어요.
import { CommonModule } from "@angular/common";
import { NgModule } from "@angular/core";
import { HighlightDirective } from "./highligh.directive";
@NgModule({
declarations: [HighlightDirective],
imports: [CommonModule],
exports: [HighlightDirective]
})
export class HighlightModule {}
강조 표시 명령
현재, 우리의 설정이 완성되었습니다. 우리는 우리의 지령을 만들기 시작할 수 있습니다. 모든 마법이 발생할 것입니다.
import {
Directive,
ElementRef,
HostBinding,
Input,
OnChanges,
SecurityContext,
SimpleChanges
} from "@angular/core";
import { DomSanitizer, SafeHtml } from "@angular/platform-browser";
@Directive({
selector: "[highlight]"
})
export class HighlightDirective implements OnChanges {
@Input("highlight") searchTerm: string;
@Input() caseSensitive = false;
@Input() customClasses = "";
@HostBinding("innerHtml")
content: string;
constructor(private el: ElementRef, private sanitizer: DomSanitizer) {}
ngOnChanges(changes: SimpleChanges) {
if (this.el?.nativeElement) {
if ("searchTerm" in changes || "caseSensitive" in changes) {
const text = (this.el.nativeElement as HTMLElement).textContent;
if (this.searchTerm === "") {
this.content = text;
} else {
const regex = new RegExp(
this.searchTerm,
this.caseSensitive ? "g" : "gi"
);
const newText = text.replace(regex, (match: string) => {
return `<mark class="highlight ${this.customClasses}">${match}</mark>`;
});
const sanitzed = this.sanitizer.sanitize(
SecurityContext.HTML,
newText
);
this.content = sanitzed;
}
}
}
}
}
코드 분해를 진행합시다.우리가 가장 먼저 필요한 것은 지령 중의 입력이다.우리는 사실상 검색어만 필요하지만, 나는 명령에 약간의 추가 기능을 추가했다.강조 표시된 텍스트 제공
customClasses
과 다른 로고 caseSensitive
를 선택할 수 있습니다. 이 사례와 일치해야 하는지 여부를 결정합니다.@Input("highlight") searchTerm: string;
@Input() caseSensitive = false;
@Input() customClasses = "";
다음은 숙주 요소의 속성에 값을 추가할 수 있는 HostBinding
ref를 추가합니다.@HostBinding("innerHtml")
content: string;
우리는 숙주 원소의 innerHtml
(ref 속성에 귀속됩니다.우리도 이렇게 할 수 있다.this.el.nativeElement.innerHtml = 'some text';
숙주 요소에 접근하기 위해 우리는 구조 함수에 ElementRef
를 주입했고 직접적인 HTML 작업을 처리하기 위해 DomSanitizer
ref를 주입하여 HTML을 원소에 주입하기 전에 정리했다.이제 우리는
ngOnChanges
ref생명주기 갈고리에서 작성할 수 있는 실제 논리에 대해 계속 토론할 것이다.따라서 검색어가 바뀔 때 하이라이트를 업데이트할 수 있습니다.흥미로운 점:const regex = new RegExp(this.searchTerm,this.caseSensitive ? "g" : "gi");
const newText = text.replace(regex, (match: string) => {
return `<mark class="highlight ${this.customClasses}">${match}</mark>`;
});
const sanitzed = this.sanitizer.sanitize(
SecurityContext.HTML,
newText
);
this.content = sanitzed;
우선, 일치하는 항목을 찾을 수 있도록 정규 표현식을 설정합니다.caseSensitive
조건에 따라 우리는 서로 다른 정규 표현식 표지를 추가하기만 하면 된다.mark
(ref 방법으로 replace
포장 일치 항목을 표시할 뿐입니다.const newText = text.replace(regex, (match: string) => {
return `<mark class="highlight ${this.customClasses}">${match}</mark>`;
});
그 다음에 newText (HTML 문자열) 를 정리해야 innerHTML에 연결할 수 있습니다.우리는 sanitize
클래스에서 DomSanitizer
ref 방법을 사용합니다.const sanitzed = this.sanitizer.sanitize(
SecurityContext.HTML,
newText
);
현재 우리는 소독을 거친 값을content
속성에 분배하고 이 속성은innerHTML
을 통해HostBinding
에 추가한다.사용법
이것이 바로 우리가 구성 요소에서 그것을 사용하는 방식이다.우리의 지령을 조립품에 사용할 수 있도록 수입
HighlightModule
을 확보하세요.<p [highlight]="searchTerm" [caseSensitive]="true" customClasses="my-highlight-class">
Lorem Ipsum has been the industry's standard dummy text ever since the
1500s, when an unknown printer took a galley of type and scrambled it to
make a type specimen book.
</p>
이게 다야!우리는 명령을 사용하여 매우 간단한 텍스트 하이라이트 디스플레이를 성공적으로 만들었다.여느 때와 마찬가지로 위의 코드를 직접 다시 사용하지 말고 최적화를 시도하십시오. 언제든지 기능을 추가하거나 삭제할 수 있습니다.데모 및 코드
코드 샌드박스: https://codesandbox.io/s/ng-highlight-11hii
연락 주세요.
보안 유지❤️
Reference
이 문제에 관하여(단락에서 간단한 지시로 텍스트를 강조하다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/angular/highlight-text-in-paragraphs-with-a-simple-directive-in-angular-2da텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)