0

我是一家咖啡店的志愿者。我已经构建了一个应用程序,可以向咖啡师展示饮料配方。这是一个快速快照:

在此处输入图像描述

数据来自 firebase 实时数据库。这是该数据库的一个片段:

在此处输入图像描述

我想要做的是将一些 HTML 放入说明中以格式化它以便于阅读。我通过将模板文件中的内容绑定到 [innerHTML] 来做到这一点,如下所示:

 <ion-item>
          <ion-grid>
            <ion-row *ngIf="!item.temperature">
              <ion-col>
                <ion-label><strong>Instructions</strong></ion-label>
              </ion-col>
            </ion-row>
            <ion-row>
              <ion-col>
                <h5 *ngIf="this.compactMode">
                  <span [innerHTML]="item.instructions"></span>
                </h5>
                <span *ngIf="!this.compactMode" [innerHTML]="item.instructions">
                </span>
              </ion-col>
              <ion-col *ngIf="item.image"
                ><ion-img
                  (click)="onClickImage(item.image)"
                  src="{{item.image}}"
                ></ion-img
              ></ion-col>
            </ion-row>
          </ion-grid>
        </ion-item>

问题 这对<b> <ol> <ul> <li> <br>等等非常有效。但它不适用于<ion-checkbox>输入<input type="checkbox"> 标签在呈现之前在某处被过滤掉。

安全 我知道将 HTML 放入数据库可以增加我的安全面,所以我使用sanitizer过滤 HTML,然后尝试在事后添加。这是我的做法:

  stringFormat(inputString: string) {
    const re1 = /\[\]/gi;
    let returnString = this.sanitizer.sanitize(1, inputString);
    returnString = returnString.replace(re1, '<ion-checkbox id=\'input\'></ion-checkbox>');
    return returnString;
  }

你会注意到我首先清理了字符串,然后我做了一个替换,替换[]为复选框。

(如果您有兴趣,我只是在制作一个打开/关闭清单,如果人们在完成任务后可以触摸复选框会很好......我不打算存储复选框值,我只想要复选框的用户体验。)

我已经检查过 item.instructions 实际上在 item 对象中包含了替换的字符串,但是当由 ionic/angular 呈现时,实际文本似乎过滤掉了除普通 HTML 标签之外的任何内容。

最后的问题 那么问题来了:对于使用 [innerHTML] 绑定可以插入到 DOM 中的内容是否存在某种限制?这是我想太多了吗?

谢谢。

4

1 回答 1

0

阅读https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML后,我得出结论,使用上面建议的方法确实没有安全的方法来做到这一点

我将在数据库的item.instructions字段中设置一个段落数组,而不是在数据库中嵌入 HTML。数组中的每个元素都可以有一个键:值对来指示该元素是代表一个普通段落还是一个复选框。

在此处输入图像描述

然后我可以遍历指令数组 ( *ngFor),并且对于每条指令,我可以检查指令类型 ( )<div *ngIf="item.type===...>以确定是否用 an<ion-text><ion-checkbox>

于 2021-10-06T22:56:18.397 回答