【问题标题】:Adding dynamic HTML from component to HTML is removing a property / attribute将动态 HTML 从组件添加到 HTML 正在删除属性/属性
【发布时间】:2020-03-08 04:15:56
【问题描述】:

我正在尝试将 html 从 editpage.ts 添加到 editpage.html

editpage.ts

var strHTML = '<p [contentEditable]="contentEditable" >abc<p>';
this.possibleHTML = strHTML;
 this.possibleHTML = this.possibleHTML.map(value => this._sanitizer.bypassSecurityTrustHtml(value));

editpage.html

<div  id="main-wrapper">   
    <content *ngIf="possibleHTML">
           <div [innerHtml]="possibleHTML"></div>
    </content>
</div>

当这个被插入,然后在开发者工具中,它看起来像这样

<h1 _ngcontent-c2>Hii<h2>

我的[contentEditable]="contentEditable" 属性消失了。我需要动态注入 HTML,我需要这个属性来更改文本。

编辑

我的component.ts

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-filemanager',
  templateUrl: './filemanager.component.html',
  styleUrls: ['./filemanager.component.css']
})
export class FilemanagerComponent implements OnInit {

  constructor() { }

  ngOnInit() {
this.document.getElementById("main-wrapper").innerHTML += "<p [contentEditable]="contentEditable" >abc<p>";
  }

}

现在我想要的是,我的属性不应该丢失。

【问题讨论】:

  • 使用 [innerHTML]="..." 添加的 HTML 会被 Angular 忽略。你永远无法让 Angular 解析值绑定或事件绑定,或者为以这种方式添加的内容创建组件。如果您希望 Angular 将字符串作为模板内容动态处理,您可以在运行时创建一个组件并 JIT 编译它。
  • 下面的例子正在运行
  • 它没有使用[innerHTML]="..."添加任何特定于Angular的东西

标签: angular typescript dom


【解决方案1】:

不久前我自己也遇到过这个问题。问题在于 contentEditable 如果您动态添加它,它将不会添加到您的标签中。如果要添加它,则必须使用HTMLElementinnerHTML

这意味着您可以使用 @ViewChild 装饰器,或者使用 JQuery 来查找您的元素。但它不能通过使用 Angular 绑定来工作。

希望这会有所帮助。

编辑这是在我的项目中工作的示例:

@ViewChild('itcamStr') itcamStr: ElementRef; 

// ... Doing other stuff in my component 

randomFunction() {
    // ... Doing stuff not related before
    this.itcamStr.nativeElement.innerHTML += this.buildLabel('string', 'type');
}

buildLabel(s: string, type: string): string {
    return `<label class="label label-${type} itcam-label" contenteditable="false">${s}</label>`;
}

EDIT 2这是一个完整的组件:

import { Component, OnInit, ViewChild, ElementRef } from '@angular/core';

@Component({
  selector: 'my',
  template: '<div #child></div>',
})
export class MyComponent implements OnInit {
    @ViewChild('child') child: ElementRef;

    ngOnInit() {
        this.child.nativeElement.innerHTML = `<p contenteditable>Editable Content</p>`;
    }
}

在您的 HTML 页面中,您只需执行 &lt;my&gt;&lt;/my&gt;

【讨论】:

  • 您能否提供一个我可以尝试的示例,即使使用 innerHTML 我们也面临同样的问题。我的同事发布了这个 - stackoverflow.com/questions/44556633/…
  • 当然,请看我的编辑。我稍微更改了自己的代码,但这里有一个完整的工作示例
  • 我是 Angular 新手,这看起来有点复杂,我在 5 分钟后编辑我的问题,请您在我的简单 ts 代码中调整此代码,对测试有帮助
  • 更好,我将使用完全正常工作的组件进行另一次编辑。等一下。
  • 那东西有效,但是当我尝试这样 - this.child.nativeElement.innerHTML =

    可编辑内容

    ;这不起作用,它实际上在我点击编辑按钮,使[contenteditable]="true",对此有什么建议吗?
猜你喜欢
  • 2013-01-04
  • 2018-07-22
  • 2016-08-07
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多