#javascript #angular
#javascript #angular
Вопрос:
Я пытался отобразить простую строку с помощью [innerHTML], но у меня ничего не получается. В основном моя проблема заключается в том, когда я использую <> . Например, если моя строка:
someText = "abc <1231> color";
Я могу визуализировать
abc <1231> цвет
но если моя строка: «abc
цвет abc
Как я могу отобразить свою строку с помощью [innerHTML]?
Ответ №1:
Если вы хотите вставить только общий текст, а не фактический HTML, вы должны использовать следующий синтаксис:
<div>{{someText}}</div>
Если для вас важно использовать [innerHTML] по какой-либо причине, вы можете использовать someText = 'abc <1231> color'.replace(/</g, 'amp;<')
для удаления всех ваших HTML-тегов и, таким образом, решить вашу проблему.
Затем вы можете НЕ использовать какой-либо HTML в своем элементе.
Чтобы разрешить определенные элементы HTML, вы могли бы использовать что-то вроде этого:
const someText = '<b>Bold Text <123></b>'.replace(/<((b|i|u|strong|a)s|>)/g, 'amp;<$1';
В любом случае, очень небезопасно вставлять пользовательский HTML-контент в ваши компоненты.
Вы можете просмотреть эту документацию, чтобы понять, почему.
Ответ №2:
Я хотел бы добавить здесь немного предостережения, потому что есть несколько проблем с двумя предыдущими ответами.
Во-первых, я бы не стал использовать innerText
or innerHTML
полностью, если вы просто пытаетесь отобразить общие текстовые данные. Именно по этой причине Angular имеет встроенную привязку к данным, и я бы рекомендовал использовать это. Как упоминалось в первой части примера @nrausch.
Во-вторых, если по какой-то причине ваша конечная цель — отобразить HTML через innerHTML
свойство для пользователя, правильный подход — очистить HTML с помощью встроенного в Angular DomSanitizer
Вот пример того, как использовать DomSanitizer:
Сначала создайте канал очистки:
import { DomSanitizer } from '@angular/platform-browser'
import { PipeTransform, Pipe } from "@angular/core";
@Pipe({ name: 'safeHtml'})
export class SafeHtmlPipe implements PipeTransform {
constructor(private sanitized: DomSanitizer) {}
transform(value) {
return this.sanitized.bypassSecurityTrustHtml(value);
}
}
Во-вторых, используйте канал в ваших компонентах HTML:
<div><strong>Binding Example:</strong> {{ name }}</div>
<div [innerHtml]="myHTML | safeHtml"></div>
Вот пример StackBlitz, который показывает вам оба метода.
Ответ №3:
Существует 2 решения
-
Используя
innerText
вместоinnerHTML
. -
Вместо того, чтобы использовать
<>
someText, you can use
буквы <>to show
<amp;
>`.
someText = "abc amp;<1234amp;> color";
Комментарии:
1. ну, в основном эти <> поступают из серверной части, и ваше решение должно быть регулярным выражением и проходить через всю строку, чтобы найти их. Я не просто заменяю их вручную
2. Вы можете использовать
someText.replaceAll("<", "amp;<")
для замены всех букв.3. или вы можете использовать
innerText
вместоinnerHTML
, и этой проблемы не будет.4. Мне больше нравится ваше решение для внутреннего текста. Спасибо, брат!
5. Я только что сделал :). Еще раз спасибо