2014-04-27 2 views
38

ich eine Dienstleistung, die Bild-URL zurückgibt, und es wird mit dem folgenden Code aufgerufen:AngularJS - ng-Stil nicht css Hintergrund Eigenschaft nicht aktualisiert

angular.forEach(results, function (item) { 
    item.img = "/images/searchItem.jpg"; 
    $http.post("https://my.api.com/?id=" + item.id).success(
      function (url) { 
       item.img = url; 
      }); 
}); 

auf meiner Sicht habe ich mit ng ein Bild haben -src Attribut, das perfekt wie so gearbeitet:

<img ng-src="{{item.img}}"> 

Dann anstelle Hintergrund-Bild auf einem SPAN zu verwenden, habe ich mich entschlossen hat:

<span ng-style="{'background':'transparent url({{item.img}})'}"></span> 

funktioniert nun der Fluss nur auf dem ersten Lauf, nach, dass ich sehen kann (in der Konsole) die folgende html

<span ng-style="{'background':'transparent url(http://expertsimages.liveperson.com/images/rating/rate10.gif)'}" style="background-image: url(https://fb.lp-chat.com/images/searchItem.jpg); background-color: transparent; background-position: initial initial; background-repeat: initial initial;"></span> 

, die anzeigt, dass die Variable aktualisiert, aber die HTML-Datei auf seinen ursprünglichen Zustand noch.

Ich habe versucht, apply/digest auf post Erfolg, aber bekam einen Fehler $ Digest bereits in Bearbeitung (die Sinn machen). Das Problem ist, dass nach einem normalen Digest (zum Beispiel bei anderen Änderungen) der Stil angewendet wird und ich das richtige Bild sehe.

Was fehlt mir hier?

Update: Ich habe ein JS fiddle erstellt, das dieses Problem demonstriert ... sieht aus wie ein Fehler in dem Winkel mir.

Antwort

76

Ich lief auch in diesem. Anstatt mit {{ }} zu bewerten, verwenden Sie Zeichenfolge + Wert Verkettung.

Dies funktioniert:

<span ng-style="{'background':'transparent url(' + item.img + ')'}"></span>)

Hier ist eine Arbeitsversion Ihres fiddle

+0

Können Sie erklären, warum das nicht funktioniert? –

+0

Ich denke, es ist normal über den Beobachter, der in diesem Fall keine tiefe Überwachung anwendet. – Disfigure

+0

Beispiel: Hintergrundfarbe ist immer noch gleich, auch wenn sich ihr Wert ändert, aber wenn Sie eine Farbeigenschaft hinzufügen, wird sie angewendet, weil eine neue Eigenschaft auf der ersten Ebene hinzugefügt wird. – Disfigure

6

Wo Sie gerade Ihren Umfang Variable aktualisieren, wickeln diese in einem $timeout Aufruf, das Updates für Ihren Anwendungsbereich drücken und anschließend die Ansicht, dies wird das Update auf die nächsten digest effektiv stößt die Digest bereits im Gang die Vermeidung von Konflikten :

$timeout(function(){ 
     $scope.var = value; 
    }); 

This question thread können Sie einige nützliche Informationen in Bezug auf apply vs timeout etc geben

+1

Danke für die Antwort, ich werde es überprüfen –

+2

Ich habe versucht, die Zeitüberschreitung, aber es hat das Problem nicht behoben ... Ich versuchte sogar eine 10 Sekunden Verzögerung, th de inspiziert das Element. Nach 10 Sekunden wurde das Attribut ng-style aktualisiert, die Ansicht blieb jedoch unverändert. irgendeine neue Idee? –

+1

Das funktioniert perfekt. Wegen der Art und Weise, wie Timeout funktioniert, brauchen Sie eigentlich gar keine Zeitverzögerung einzuplanen. Vielen Dank! – charliebeckwith

11

Es funktioniert nicht, weil die Winkel conten bewerten t der einzelnen Klammer nur einmal und nicht die Variable, die Sie innerhalb dieser Zeichenfolge binden möchten.

Sie könnten jedoch Ihre eigene Richtlinie als solche erstellen:

app.directive('backImg', function(){ 
    return function(scope, element, attrs){ 
     attrs.$observe('backImg', function(value) { 
      element.css({ 
       'background': 'transparent url(' + value +')' 
      }); 
     }); 
    }; 
}); 

und es dann so in der Vorlage verwenden:

<div ng-if="vis" class="container" back-img="{{imgSrc}}"></div> 

Ich habe Ihre Geige aktualisiert und es scheint gut zu funktionieren http://jsfiddle.net/dS4pB/3/

-1

Angular 2 eine süße Art und Weise, dies zu tun hat, = "Wert"

[style *.]
<span [style.background-color]="transparent" [style.background-image]="item.img"></span> 
+1

Nicht wirklich nützlich, da die Frage für NG1 ist ... – RPDeshaies

+0

@RPDeshaies Vielleicht, aber wie Angular 2 mehr einer Folge gewinnt, wird diese Frage immer noch potenziell Top-Google-Ergebnis für Menschen auf der Suche nach diesen Antworten auf sein der neue Rahmen –

Verwandte Themen