Оберните определенные слова компонентом в contenteditable div в angular - PullRequest
1 голос
/ 27 марта 2020

Я пытаюсь заменить динамический c текст, который приходит из contenteditable div, сортировать слова с помощью регулярных выражений и обернуть их компонентом angular.

Пока что я нашел способ заменить этот текст тегом компонента, но я не могу заставить компонент работать. Вместо этого он просто показывает компонент как пустой.

Как я могу вручную запустить / запустить эти динамически добавленные компоненты?

app.component. html:

<div #from_field (keyup)="textarea_keyup_event(from_field)" contenteditable="true">
  This text can be edited by the user.
  If the user writes the 'moo' word, it should be wrapped with "replacer" component.
</div>

app.component.ts:

function getFormattedText(text) {
    var parts = text.split(/(\bmoo+\b)/gi);
    for (var i = 1; i < parts.length; i += 2) {
      parts[i] = '<app-replacer key="'+ i + '">' + parts[i] + '</app-replacer>';
    }
    return parts.join('');
}
textarea_keyup_event(element) {
  const preFormattedText = element.textContent;
  element.innerHTML = getFormattedText(preFormattedText);
}

// if you write:
// "I am a cow; cows say moo. MOOOOO."
// it replaces the DOM with this:
// "I am a cow; cows say <app-replacer key="1">moo</app-replacer>. <app-replacer key="3">MOOOOO</app-replacer>."
// but the app-replacer tag doesn't fire up the component.

1 Ответ

2 голосов
/ 27 марта 2020

Я бы сделал это с помощью веб-компонента.

Angular имеет библиотеку @angular/elements, которая позволяет нам создавать веб-компонент из Angular компонента.

app.module.ts

import { createCustomElement } from '@angular/elements';

@NgModule({
  imports: [
    BrowserModule
  ],
  declarations: [
    AppComponent,
    ReplacerComponent
  ],
  entryComponents: [ReplacerComponent],
  bootstrap: [AppComponent]
})
export class AppModule {
  constructor(private injector: Injector) {
    if (!customElements.get('app-replacer')) {
      const btnComp = createCustomElement(ReplacerComponent, {
        injector: this.injector
      });
      customElements.define('app-replacer', btnComp);
    }
  }
}

Как только вы определили ReplacerComponent как веб-компонент, все теги app-replacer в вашем contenteditable div будут автоматически отображаться как компоненты.

Ng-run Пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...