【问题标题】:innerHtml doesn't work with ionic 2 pipes, how to?innerHtml 不适用于 ionic 2 管道,如何?
【发布时间】:2016-09-09 18:27:55
【问题描述】:

我有一个返回一些 html 的简单管道

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
    name: 'rating',
    pure: false
})
export class RatingPipe implements PipeTransform {
    transform(value: any): string {
        let stars = "<ion-icon name='star'>" + value + "</ion-icon>";
        return stars;
    }
}

问题是当我使用它时,我什么也得不到

// this works fine
<p><span innerHtml="{{'<h1>some text</h1>'}}"></span></p>

// if I add a pipe, it doesn't work
<p><span innerHtml="{{variableFromControler | rating}}"></span></p>

// if I add a pipe, it doesn't work
<p><span [innerHtml]="variableFromControler | rating"></span></p>

有什么想法吗?

一个解决方案

import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizationService } from '@angular/platform-browser'; // to become DomSanitizer

@Pipe({
    name: 'rating',
    pure: false
})
export class RatingPipe implements PipeTransform {
    sanitizer: any;
    constructor(private domSanitizationService: DomSanitizationService) {
        this.sanitizer = domSanitizationService;
    }

    transform(value: any): string {
        value = parseInt(value);
        let stars = '';

        for(let i = 1; i <= 5; i++) {
            stars += i <= value ? "<ion-icon class='ion-ios-star'></ion-icon>" : "<ion-icon class='ion-ios-star-outline'></ion-icon>";
        }

        return this.sanitizer.bypassSecurityTrustHtml(stars);
    }
}

documentation on DomSanitizationService

【问题讨论】:

    标签: javascript angular ionic2 innerhtml angular-pipe


    【解决方案1】:

    它不适用于这个 html

    "<ion-icon name='star'>" + value + "</ion-icon>"
    

    因为ion-icon 是一个离子角度组件,它应该通过angular2 加载,而不是仅仅使用innerHTML

    无论如何,您应该像这样为您的 html 管道使用 DomSanitanizeService:

    @Pipe({
        name: 'rating',
        pure: false
    })
    export class RatingPipe implements PipeTransform {
        constructor(private domSanitizer: DomSanitizationService){}
        transform(value: any): string {
            let stars = "<div>" + value + "</div>";
            return this.domSanitizer.bypassSecurityTrustHtml(stars);
        }
    }
    

    在你的 html 中你必须使用属性绑定:

    <span [innerHtml]="text | rating"></span>
    

    我会为您的案例使用自定义图标包装器:

    @Component({
      selector: 'ion-rating-icon',
      template: '<ion-icon name="star">{{rating}}</ion-icon>'
    }) 
    class RatingIconComponent {
      @Input() rating;
    } 
    

    然后像这样使用它:

    <ion-rating-icon [rating]="text"></ion-rating-icon>
    

    查看 Plunker

    中的所有示例

    【讨论】:

    • 是的,刚刚找到了相同的解决方案。我更新了我的帖子
    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2013-08-05
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多