Angular 样式内的字符串插值 属性 不起作用

Angular string interpolation within a style property not working

真的挂了一会儿....这不应该工作吗?

style="background-image:url('{{product.imageUrl}}')"

我无法在堆栈片段或 Codepen 中重现,因为它 angular 特定。

我已经尝试过此线程的建议但无济于事:

https://github.com/angular/angular/issues/8745 https://github.com/angular/angular/issues/8491 https://github.com/angular/angular/issues/8514

可能是因为我不明白在这种情况下应该把 'safe' 管道放在哪里。谢谢。

模板上下文:

<div *ngIf="product.title"
    class="card">
    <!-- <img *ngIf="product.imageUrl"
        class="card-img-top"
        [src]="product.imageUrl"
        alt="{{product.title}}"> -->

    <div *ngIf="product.imageUrl"
        class="card-img-top scale-img"
        style="background-image:url('{{product.imageUrl}}')"></div>

    <div class="card-body">
        <h5 class="card-title">{{product.title}}</h5>
        <p class="card-text">{{product.price | currency}}</p>


        <div *ngIf="showActions && Cart"
            class="card-footer">


            <button [routerLink]="['/products/', product.$key]"
                class="btn btn-details btn-secondary btn-block">Details</button>


            <button *ngIf="Cart.getQuantity(product) === 0; else updateQuantity"
                (click)="addToCart()"
                class="btn btn-secondary btn-block">Add to Cart</button>

            <ng-template #updateQuantity>
                <product-quantity [product]="product"
                    [cart]="Cart"></product-quantity>
            </ng-template>
        </div>

    </div>

</div>

通常我们通过创建自定义管道来解决它:

html

[style.backgroundImage]="product.imageUrl | safeStyle"

ts

@Pipe({
  name: 'safeStyle'
})
export class SafeStylePipe {
  constructor(private sanitizer: DomSanitizer) {}

  transform(val: string) {
    return this.sanitizer.bypassSecurityTrustStyle(`url('${val}')`);
  }
}

============================================= ==============================

我不想混淆这个简洁的答案,但如果您仍有问题:

我收到 "safeStyle not found" 错误,所以我提取了管道。

  1. 创建另一个名为 'pipes'
  2. 的文件夹
  3. 制作文件。我打电话给 'safe-style.ts'
  4. 将此代码放入(编辑器希望我使用 PipeTransform):

    从'@angular/core'导入{PipeTransform,管道}; 从'@angular/platform-browser'导入{DomSanitizer};

    @管道({ 姓名:'safeStyle' }) 导出 class SafeStylePipe 实现 PipeTransform { 构造函数(私人消毒剂:DomSanitizer){}

    转换(值:字符串){ return this.sanitizer.bypassSecurityTrustStyle(url('${val}')); } }

  5. 注释掉@Pipe 代码并删除您放入组件中的管道导入。

  6. 导入组件:

    从'../pipes/safe-style'导入{SafeStylePipe};

  7. 在应用程序模块中声明您的管道并导入它。

    import { SafeStylePipe } from './pipes/safe-style';
    

    ... 声明:[ SafeStylePipe, ]

  8. 应该可以,但如果您仍然遇到该错误。我替换了(参见模板上下文)...

    <p class="card-text">{{product.price | currency}}</p>
    

    <p class="card-text">{{product.price | safeStyle}}</p>

不知怎么的,错误消失了,然后我就把它改回了货币。我认为这是一个错误。但是,嘿,现在可以用了。

Ng-run Example