Окраска содержимого тега textarea в формате JSON (с цветами)


У меня есть приложение Angular, в этом приложении у меня есть текстовая область, в которую я всегда буду писать текст в формате JSON, я хочу, чтобы это было в тот же момент, когда я пишу в этой текстовой области, в случае, если json действителен, я хочу текст должен быть красочным (ключ с цветом и значение с другим цветом) (это что-то похожее на Postman при написании JSON).

Что я пробовал на данный момент :
HTML:

` <textarea
     pInputText
     placeholder = "required name and schemaJson object"
     formControlName = "schema"
     id = "schema" rows = "10" cols = "50" required
     (input) = "updateTextColor($event.target.value)">
                        </textarea>````




Машинопись:

updateTextColor(text: string): void {
    try {
      const jsonObject = JSON.parse(text);
      const coloredText = this.colorizeJSON(jsonObject);
      document.getElementById('schema').innerHTML = coloredText;
    } catch (error) {
      // If JSON parsing fails, keep the text as is
      document.getElementById('schema').innerText = text;
    }
  }

  colorizeJSON(obj: any): string {
    let coloredText = '';
    for (const key in obj) {
      if (obj.hasOwnProperty(key)) {
        coloredText += `<span class = "json-key">${key}</span>: `;
        if (typeof obj[key] === 'object') {
          coloredText += this.colorizeJSON(obj[key]);
        } else {
          coloredText += `<span class = "json-value">${obj[key]}</span>`;
        }
        coloredText += ', ';
      }
    }
    // Remove trailing comma and return
    return coloredText.replace(/,\s*$/, '');
  }

PS: я пробовал использовать Ngx-monaco, но не получилось из-за других ошибок.

Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Элемент Textarea не поддерживает рендеринг HTML-содержимого непосредственно внутри него. Вот аналогичный вопрос. В случае angular вам не нужно создавать строку со строкой html в качестве содержимого в вашем файле .ts. Используйте *ngFor/ @for и *ngIf/@if, чтобы создать нужную вам структуру HTML (используя div и span), а затем переберите ключ/значение, полученное из этого JSON, и назначьте их span, используя привязку следующим образом:

<div class = "some-class-to-look-like-textarea-before">
    <span *ngFor = "let spanColor of parsedColors" [style.color] = "spanColor">Your text here</span>
</div>

Другие вопросы по теме