anglejs ng-style: Hintergrundbild funktioniert nicht

76

Ich versuche, ein Hintergrundbild mithilfe des Winkels auf ein Div anzuwenden ng-style(ich habe zuvor eine benutzerdefinierte Direktive mit demselben Verhalten ausprobiert), aber es scheint nicht zu funktionieren.

<nav
    class="navigation-grid-container"
    data-ng-class="{ bigger: isNavActive == true }"
    data-ng-controller="NavigationCtrl"
    data-ng-mouseenter="isNavActive = true; $parent.isNavActive = true"
    data-ng-mouseleave="isNavActive = false; $parent.isNavActive = false"
    data-ng-show="$parent.navInvisible == false"
    data-ng-animate="'fade'"
    ng-cloak>

    <ul class="navigation-container unstyled clearfix">
        <li
            class="navigation-item-container"
            data-ng-repeat="(key, item) in navigation"
            data-ng-class="{ small: $parent.isNavActive, big: isActive == true }"
            data-ng-mouseenter="isActive = true; isInactive= false"
            data-ng-mouseleave="isActive = false; isInactive= true">

            <div data-ng-switch on="item.id">

                <div class="navigation-item-default" data-ng-switch-when="scandinavia">
                    <a class="navigation-item-overlay" data-ng-href="{{item.id}}">
                        <div class="navigation-item-teaser">
                            <span class="navigation-item-teaser-text" data-ng-class="{ small: isScandinavia }">{{item.teaser}}</span>
                        </div>
                    </a>
                    <span class="navigation-item-background" data-ng-style="{ 'background-image': 'public/img/products/{{item.id}}/detail/wide/{{item.images.detail.wide[0]}}' }"></span>
                </div>

                <div class="navigation-item-last" data-ng-switch-when="static">
                    <div class="navigation-item-overlay">
                        <div class="navigation-item-teaser">
                            <span class="navigation-item-teaser-text">
                                <img data-ng-src="{{item.teaser}}">
                            </span>
                        </div>
                    </div>
                    <span class="navigation-item-background">
                        <img class="logo" data-ng-src="{{item.images.logo}}">
                    </span>
                </div>

                <div class="navigation-item-default" data-ng-switch-default>
                    <a class="navigation-item-overlay" data-ng-href="{{item.id}}">
                        <div class="navigation-item-teaser">
                            <span class="navigation-item-teaser-text">{{item.teaser}}</span>
                        </div>
                    </a>
                    <span class="navigation-item-background" data-ng-style="{ 'background-image': 'public/img/products/{{item.id}}/detail/wide/{{item.images.detail.wide[0]}}' }"></span>
                </div>

            </div>
        </li>
    </ul>
</nav>

Wenn ich jedoch eine Hintergrundfarbe versuche, scheint sie gut zu funktionieren. Ich habe eine Remote-Quelle und eine lokale Quelle ausprobiert http://lorempixel.com/g/400/200/sports/, aber beide haben nicht funktioniert.

Roland
quelle

Antworten:

113

Richtige Syntax für background-imageist:

background-image: url("path_to_image");

Die korrekte Syntax für den ng-Stil lautet:

ng-style="{'background-image':'url(https://www.google.com/images/srpr/logo4w.png)'}">
Stewie
quelle
Übrigens, wie rendere ich so etwas wie : {{products.products[currenRoute].desc}}; in html?
Roland
Ich nehme an, currentRouteist eine Produkt-ID von der Route? Wenn dies der Fall ist, enthält der Dienst $ routeParams, wenn Sie ihn in Ihren Controller einfügen, den Verweis auf Ihre ID ( $scope.productId = $routeParams.id), vorausgesetzt, Ihre Route ist als '/ products /: id' definiert. Aber vielleicht möchten Sie dafür eine neue Frage eröffnen.
Stewie
So etwas, aber ich habe bereits Zugang zu currenRoute. Es ist eine Zeichenfolge, daher habe ich eine Liste von Produkten: snippi.com/s/rznpfvo ; und currentRoutees ist eine Zeichenfolge, die mit einer der IDs in der Produktliste übereinstimmt. Und da ich nicht kann, muss {{products.products.currenRoute.desc}}ich einen anderen Weg finden ...
Roland
Verwenden Sie beispielsweise underscore.js in Ihrem Controller: $scope.product = _($scope.products).findWhere({id: $scope.currentRoute})und als in Ihrer Ansicht : <span>{{product.title}}</span>. Verwenden wir jedoch keine Kommentare als Chat. Stellen Sie eine neue Frage.
Stewie
186

Es ist möglich, dynamische Werte auf verschiedene Arten zu analysieren.

Interpolation mit doppelt geschweiften Klammern:

ng-style="{'background-image':'url({{myBackgroundUrl}})'}"

String-Verkettung:

ng-style="{'background-image': 'url(' + myBackgroundUrl + ')'}"

ES6-Vorlagenliterale:

ng-style="{'background-image': `url(${myBackgroundUrl})`}"
sqren
quelle
13
Dies ist tatsächlich die beste Antwort (oder zumindest auf mein Problem ...)
standup75
5
Sie können auch einen Ausdruck mit geschweiften Klammern schreiben:data-ng-style="{'background-image':'url(img/products/{{product.img}})'}"
mykola.rykov
Beachten Sie, dass url()der Browser den Wert möglicherweise ablehnt und nicht festlegt, wenn Sie eine falsche Syntax verwenden (z. B. in einfachen Anführungszeichen ).
Ihre Option hat bei mir nicht funktioniert. aber die 2. Option hat funktioniert. Vielen Dank
Joe Naber
Erstens funktioniert nicht. zweite Arbeit. die beste Antwort danke
Adesh Kumar
15

Wenn Sie Daten haben, warten Sie auf die Rückgabe des Servers (item.id) und haben ein Konstrukt wie das folgende:

ng-style="{'background-image':'url(https://www.myImageplusitsid/{{item.id}})'}"

Stellen Sie sicher, dass Sie so etwas hinzufügen ng-if="item.id"

Andernfalls haben Sie entweder zwei oder eine fehlerhafte Anfrage.

flockig
quelle
10

Für diejenigen, die Schwierigkeiten haben, dies mit IE11 zum Laufen zu bringen

HTML

<div ng-style="getBackgroundStyle(imagepath)"></div>

JS

$scope.getBackgroundStyle = function(imagepath){
    return {
        'background-image':'url(' + imagepath + ')'
    }
}
tsuz
quelle
2
Sie haben mir gerade das Leben gerettet, danke. Ich habe Stunden damit verbracht herauszufinden, warum mein ng-Stil in IE 11 nicht angezeigt wurde. Ich verstehe immer noch nicht warum, aber das hat funktioniert!
w3bMak3r
War das einzige, was auch in Chrom (Ubuntu) funktionierte, scheinen alle anderen Beispiele oder "der offizielle Weg" ignoriert zu werden. Der Stil wird geändert, hat aber keine Auswirkung.
Davidkonrad
1

Dies hat bei mir funktioniert, geschweifte Klammern sind nicht erforderlich.

ng-style="{'background-image':'url(../../../app/img/notification/'+notification.icon+'.png)'}"

notification.icon ist hier eine Bereichsvariable.

mkkhedawat
quelle
1

Wenn wir einen dynamischen Wert haben, der in einen CSS-Hintergrund oder ein Hintergrundbildattribut eingefügt werden muss, kann die Angabe etwas schwieriger sein.

Angenommen, wir haben eine getImage () -Funktion in unserem Controller. Diese Funktion gibt eine Zeichenfolge zurück, die ähnlich wie folgt formatiert ist: url (icons / pen.png). In diesem Fall wird die ngStyle-Deklaration genauso wie zuvor angegeben:

ng-style="{ 'background-image': getImage() }"

Stellen Sie sicher, dass der Name des Hintergrundbildschlüssels in Anführungszeichen gesetzt wird. Denken Sie daran, dass dies als gültiger Javascript-Objektschlüssel formatiert sein muss.

Mohammed Amine
quelle
Was ist die Quelle des Zitats?
Manas
0

Nur für die Datensätze können Sie Ihr Objekt in der Steuerung auch folgendermaßen definieren:

this.styleDiv = {color: '', backgroundColor:'', backgroundImage : '' };

und dann können Sie eine Funktion definieren, um die Eigenschaft des Objekts direkt zu ändern:

this.changeBackgroundImage = function (){
        this.styleDiv.backgroundImage = 'url('+this.backgroundImage+')';
    }

Auf diese Weise können Sie Ihren Stil ändern.

Ezequiel
quelle
0

Die Syntax wurde für Angular 2 und höher geändert:

[ngStyle]="{'background-image': 'url(path)'}"
Maihan Nijat
quelle