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.

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)'}">

Ü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})`}"

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.


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 + ')'
    }
}

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.


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.


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.


0

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

[ngStyle]="{'background-image': 'url(path)'}"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.