วิธีเพิ่มภาพพื้นหลังโดยใช้ ngStyle (angular2)


105

จะใช้ ngStyle เพื่อเพิ่มภาพพื้นหลังได้อย่างไร? รหัสของฉันใช้ไม่ได้:

this.photo = 'http://dl27.fotosklad.org.ua/20121020/6d0d7b1596285466e8bb06114a88c903.jpg';

<div [ngStyle]="{'background-image': url(' + photo + ')}"></div>

ทำไมคุณถึงใช้วงเล็บในแอตทริบิวต์ ngStyle
gal

ดูstackoverflow.com/questions/37076867/…เกี่ยวกับปัญหาที่เกี่ยวข้องใน RC.1
GünterZöchbauer

คำตอบ:


235

ฉันคิดว่าคุณสามารถลองสิ่งนี้:

<div [ngStyle]="{'background-image': 'url(' + photo + ')'}"></div>

จากการอ่านngStyleสำนวนของคุณฉันเดาว่าคุณพลาด "'" ...


ทดสอบแล้ว. การทำงานกับ RC.1. ไม่จำเป็นสำหรับ RC.2 และรุ่นใหม่กว่าตามสิ่งที่พวกเขาพูดที่นี่
Lucio Mollinedo

4
this.photo = `url(${photo})`; [style.background-image]='photo'ฉันชอบ
สไลด์โชว์ 2

4
โปรดทราบว่าการเว้นวรรคใน URL รูปภาพ (ชื่อรูปภาพ) อาจทำให้ไม่มีการโต้ตอบ[ngStyle]และ[style.background-image]การแสดงผลล้มเหลว
vulp

83

นอกจากนี้คุณสามารถลองสิ่งนี้:

[style.background-image]="'url(' + photo + ')'"


3
@ redfox05 ฉันคิดว่า ngStyle เป็นน้ำตาลสังเคราะห์ ความแตกต่างที่สำคัญคือ ngStyle อนุญาตให้คุณใช้กฎ css ได้หลายกฎ แต่ [style. <css_prop>] อนุญาตให้ใช้ได้เพียงข้อเดียว รายการต่อไปเทียบเท่า: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> และ <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy

ฉันใช้วิธี [style.css] แล้วแม้ว่าจะไม่สามารถใช้ [style.background-repeat] ได้ แต่คุณรู้ไหมว่าทำไม?
Anders Metnik

วิธีการจัดแต่งทรงผมตามเงื่อนไขโดยใช้แนวทางนี้? สมมติว่าฉันต้องการตรวจสอบว่าภาพถ่ายไม่เป็นโมฆะแล้วใช้เฉพาะสไตล์นี้หรือไม่?
Pankaj

26
import {BrowserModule, DomSanitizer} from '@angular/platform-browser'

  constructor(private sanitizer:DomSanitizer) {
    this.name = 'Angular!'
    this.backgroundImg = sanitizer.bypassSecurityTrustStyle('url(http://www.freephotos.se/images/photos_medium/white-flower-4.jpg)');
  }
<div [style.background-image]="backgroundImg"></div>

ดูสิ่งนี้ด้วย


6

ดูเหมือนว่าสไตล์ของคุณได้รับการทำความสะอาดแล้วหากต้องการหลีกเลี่ยงให้ลองใช้วิธี bypassSecurityTrustStyle จาก DomSanitizer

import { Component, OnInit, Input } from '@angular/core';
import { DomSanitizer, SafeStyle } from '@angular/platform-browser';

@Component({
  selector: 'my-component',
  templateUrl: './my-component.component.html',
  styleUrls: ['./my-component.component.scss']
})

export class MyComponent implements OnInit {

  public backgroundImg: SafeStyle;
  @Input() myObject: any;

  constructor(private sanitizer: DomSanitizer) {}

  ngOnInit() {
     this.backgroundImg = this.sanitizer.bypassSecurityTrustStyle('url(' + this.myObject.ImageUrl + ')');
  }

}
<div *ngIf="backgroundImg.length > 0" [style.background-image]="backgroundImg"></div>



3

ภาพพื้นหลังของฉันไม่ทำงานเนื่องจาก URL มีช่องว่างอยู่ดังนั้นฉันจึงต้องเข้ารหัส URL

คุณสามารถตรวจสอบว่านี่คือปัญหาที่คุณพบหรือไม่โดยลองใช้ URL รูปภาพอื่นที่ไม่มีอักขระที่ต้องใช้ Escape

คุณสามารถทำได้กับข้อมูลในคอมโพเนนต์โดยใช้ Javascripts ที่สร้างขึ้นในencodeURI ()วิธี

โดยส่วนตัวแล้วฉันต้องการสร้างไปป์เพื่อให้สามารถใช้ในเทมเพลตได้

ในการทำเช่นนี้คุณสามารถสร้างท่อที่เรียบง่ายมาก ตัวอย่างเช่น:

src / app / ไปป์ / เข้ารหัส uri.pipe.ts

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

@Pipe({
  name: 'encodeUri'
})
export class EncodeUriPipe implements PipeTransform {

  transform(value: any, args?: any): any {
    return encodeURI(value);
  }
}

src / app / app.module.ts

import { EncodeUriPipe } from './pipes/encode-uri.pipe';
...

@NgModule({
  imports: [
    BrowserModule,
    AppRoutingModule
    ...
  ],
  exports: [
    ...
  ],
 declarations: [
    AppComponent,
    EncodeUriPipe
 ],
 bootstrap: [ AppComponent ]
})

export class AppModule { }

src / app / app.component.ts

import {Component} from '@angular/core';

@Component({
  // tslint:disable-next-line
  selector: 'body',
  template: '<router-outlet></router-outlet>'
})
export class AppComponent {
  myUrlVariable: string;
  constructor() {
    this.myUrlVariable = 'http://myimagewith space init.com';
  }
}

src / app / app.component.html

<div [style.background-image]="'url(' + (myUrlVariable | encodeUri) + ')'" ></div>

0

คุณสามารถใช้ 2 วิธี:

วิธีที่ 1

<div [ngStyle]="{'background-image': 'url(&quot;' + photo + '&quot;)'}"></div>

วิธีที่ 2

<div [style.background-image]="'url(&quot;' + photo + '&quot;)'"></div>

หมายเหตุ: สิ่งสำคัญคือต้องล้อมรอบ URL ด้วย"ถ่าน


0

ภาพส่วนใหญ่จะไม่แสดงเนื่องจาก URL ของคุณมีช่องว่าง ในกรณีของคุณคุณเกือบจะทำทุกอย่างถูกต้องแล้ว ยกเว้นสิ่งหนึ่ง - คุณยังไม่ได้เพิ่มเครื่องหมายคำพูดเดียวเหมือนที่คุณทำหากคุณระบุภาพพื้นหลังใน css Ie

.bg-img {                \/          \/
    background-image: url('http://...');
}

ในการหลีกเลี่ยงอักขระ quot ใน HTML ผ่าน \ '

                                          \/                                  \/
<div [ngStyle]="{'background-image': 'url(\''+ item.color.catalogImageLink + '\')'}"></div>

0

วิธีแก้ปัญหาของฉันโดยใช้คำสั่ง if..else เป็นแนวทางปฏิบัติที่ดีเสมอหากคุณต้องการหลีกเลี่ยงความผิดหวังที่ไม่จำเป็นเพื่อตรวจสอบว่าตัวแปรของคุณมีอยู่และได้รับการตั้งค่าแล้ว มิฉะนั้นให้จัดเตรียมภาพสำรองไว้ในกรณี คุณยังสามารถระบุคุณสมบัติหลายสไตล์เช่นbackground-position: centerฯลฯ

<div [ngStyle]="{'background-image': this.photo ? 'url(' + this.photo + ')' : 'https://placehold.it/70x70', 'background-position': 'center' }"></div>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.