javascript - 用 contenteditable div 中的组件以 Angular 包装某些单词

标签 javascript html angular string dom

我正在尝试替换来自 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.

最佳答案

我会在网络组件的帮助下完成它。

Angular 有一个 @angular/elements 库,允许我们从 Angular 组件创建 Web 组件。

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 定义为 Web 组件后,contenteditable div 中的所有 app-replacer 标记都将自动呈现为组件。

<强> Ng-run Example

关于javascript - 用 contenteditable div 中的组件以 Angular 包装某些单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60889171/

相关文章:

javascript - 叠加悬停效果

javascript - Ag-grid 高亮单元格逻辑无法正常工作

javascript - 为什么 Angular Bootstrap 模态的 Jasmine 测试失败?

javascript - 如何在开发 Rails 应用程序时维护 JavaScript 断点?

javascript - 在javascript中将div拆分为多个div

javascript - 将文件上传到 Parse (Javascript)

html - 是否可以让 :after pseudo element get focus when press tab

html - 部分页面上的滚动条

node.js - 如何在浏览器关闭时让我的应用程序注销?

javascript - 为什么可以将原型(prototype)的函数存储在变量中?