Jak dodać obraz tła za pomocą ngStyle (angular2)?

103

Jak używać ngStyle do dodawania obrazu tła? Mój kod nie działa:

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

<div [ngStyle]="{'background-image': url(' + photo + ')}"></div>
Ignat
źródło
dlaczego używasz nawiasów w atrybucie ngStyle?
gal
Zobacz także stackoverflow.com/questions/37076867/ ... o podobnym problemie w RC.1
Günter Zöchbauer.

Odpowiedzi:

233

Myślę, że możesz spróbować tego:

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

Czytając twoje ngStylewyrażenie, domyślam się, że przegapiłeś jakieś „'” ...

Thierry Templier
źródło
Przetestowany. Praca z RC.1. Nie powinno być potrzebne w RC.2 i nowszych wersjach, zgodnie z tym, co mówią tutaj
Lucio Mollinedo
4
Wolę this.photo = `url(${photo})`; [style.background-image]='photo'.
pokaz
4
Pamiętaj, że spacje w adresie URL obrazu (nazwa obrazu) mogą powodować cichy [ngStyle]i [style.background-image]błąd renderowania.
vulp
83

Możesz także spróbować tego:

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

Todmy
źródło
3
@ redfox05 Przypuszczam, że ngStyle jest cukrem syntaktycznym. Główną różnicą jest to, że ngStyle pozwala na zastosowanie kilku reguł CSS, ale [style. <css_prop>] pozwala tylko na jedną. Następne są równoważne: <div [ngStyle]="{ color: 'red', 'font-size': '22px' }">First</div> i <div [style.color]="'red'" [style.font-size.px]="22">Second</div>
Todmy
Użyłem tego podejścia [style.css], chociaż nie mogę zmusić [style.background-repeat] do działania, wiesz dlaczego?
Anders Metnik
Jak wykonać stylizację warunkową za pomocą tego podejścia? Powiedzmy, czy chcę sprawdzić, czy zdjęcie nie jest zerowe, a następnie zastosować tylko ten styl?
Pankaj
25
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>

Zobacz też

Günter Zöchbauer
źródło
6

Wygląda na to, że Twój styl został oczyszczony. Aby go ominąć, spróbuj użyć metody bypassSecurityTrustStyle z 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>

Uliana Pavelko
źródło
6

Użyj zamiast

[ngStyle]="{'background-image':' url(' + instagram?.image + ')'}"
Vijay Chauhan
źródło
3

Mój obraz tła nie działał, ponieważ adres URL zawierał spację i dlatego musiałem go zakodować.

Możesz sprawdzić, czy na tym polega problem, wypróbowując inny adres URL obrazu, który nie zawiera znaków, które wymagają zmiany znaczenia.

Możesz to zrobić z danymi w komponencie za pomocą skryptów JavaScript wbudowanych w encodeURI () metodę .

Osobiście chciałem stworzyć do niego fajkę, aby można ją było wykorzystać w szablonie.

Aby to zrobić, możesz stworzyć bardzo prostą rurę. Na przykład:

src / app / pipes / encode-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>
Tom Benyon
źródło
0

Możesz skorzystać z 2 metod:

Metoda 1

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

Metoda 2

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

Uwaga: ważne jest, aby otoczyć adres URL ciągiem char.

riofly
źródło
0

Przeważnie obraz nie jest wyświetlany, ponieważ adres URL zawiera spacje. W twoim przypadku prawie wszystko zrobiłeś poprawnie. Z wyjątkiem jednej rzeczy - nie dodałeś pojedynczych cudzysłowów, tak jak robisz, jeśli określisz obraz tła w css, tj

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

Aby to zrobić, uniknij cudzysłowu w HTML za pomocą \ '

                                          \/                                  \/
<div [ngStyle]="{'background-image': 'url(\''+ item.color.catalogImageLink + '\')'}"></div>
po prostu dobre
źródło
0

Moje rozwiązanie, używając instrukcji if..else. Jeśli chcesz uniknąć niepotrzebnych frustracji, zawsze dobrze jest sprawdzić, czy zmienna istnieje i jest ustawiona. W przeciwnym razie podaj obraz zapasowy na wypadek; Możesz także określić wiele właściwości stylu, takich jak background-position: centeritp.

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

AllJs
źródło