【问题标题】:Angular string interpolation within a style property not working样式属性中的角度字符串插值不起作用
【发布时间】:2018-03-04 18:08:11
【问题描述】:

真的挂了一段时间......这不应该工作吗?

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

我无法在堆栈 sn-p 或 Codepen 中重现,因为它的角度特定。

我尝试了这个帖子的建议,但无济于事:

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

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

模板上下文:

<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>

【问题讨论】:

  • 你确定如果你硬编码一个 url 就可以正常工作吗?
  • 是的,我确定了这一点,很奇怪吧?
  • 和注释掉的 标签工作正常

标签: angular string-interpolation property-binding


【解决方案1】:

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

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

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

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

我收到“未找到安全样式”错误,因此我提取了管道。

  1. 创建另一个名为“管道”的文件夹
  2. 制作文件。我称之为“safe-style.ts”
  3. 把这段代码放进去(编辑想让我用 PipeTransform):

    从 '@angular/core' 导入 { PipeTransform, Pipe }; 从“@angular/platform-b​​rowser”导入 { DomSanitizer };

    @管道({ 名称:“安全风格” }) 导出类 SafeStylePipe 实现 PipeTransform { 构造函数(私人消毒剂:DomSanitizer){}

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

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

  5. 导入组件:

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

  6. 在应用模块中声明你的管道并导入它。

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

    ... 声明:[ 安全风格管, ]

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

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

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

不知何故,这让错误消失了,然后我把它改回了货币。我认为这是一个错误。但是,现在可以了。

Ng-run Example

【讨论】:

  • 首先,谢谢!其次,该图像加载适合您吗?我没有创建自己的管道的经验,但我什至在示例中都没有看到它,所以我不得不问......也许我遇到了计算机问题。
  • 我换了图片 :)
  • @imnickvaughn 感谢您的编辑。我以为你知道如何使用管道)
猜你喜欢
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多