0

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>

何か案は?

1 つのソリューション

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);
    }
}

DomSanitizationService に関するドキュメント

4

1 に答える 1

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-09-09T20:14:29.397 に答える