2016-04-11 4 views
3

Innerhalb einer Fabrik Service, habe ich

$ http.get (url, {Cache: true}) verwenden

Aus meiner Sicht verwende ich ng-if oder ng-show, um einen CSS-Übergang auszulösen.


Das Problem:

Es ist großartig für die erste Anforderung arbeitet, aber offensichtlich für die nächste Anforderung der gleichen Servicefunktion wird die Animation nicht erneut ausgelöst.

Gibt es eine Möglichkeit, die ng-if/ng-show-Animation zurückzusetzen/neu zu starten?

(Der Cache wird benötigt, damit ich Wartezeiten vermeiden kann, aber ich muss immer noch Opazitätsanimation zwischen verschiedenen Zuständen ausgelöst haben).

Vielen Dank!


app.factory('progService', function ($http) { 
    var progService= {}; 
    progService.getProgram = function() { 
     return $http.get(appInfo.api_url + 'pages/5', { cache: true}); 
    }; 
    return progService; 
}); 


app.controller('programController', function($scope, progService) { 
    progService.getProgram().then(function(res){ 
     $scope.program = res.data; 
    }); 
}); 


<div ng-if="program.aJsonKey"></div> 
+0

es ist ein bisschen verwirrend hier, wenn Sie das Anfrageergebnis zwischenzuspeichern wollen, warum wollen Sie die ng-wenn Animation auslösen: Also in Ihrem Fall sollte in etwa so sein? Kannst du beschreiben, was diese Animation macht? –

+0

und was ist 'program.acf.exerpt'? –

+0

@ZhiliangTakutoXing Frage aktualisiert. Es wäre schön, wenn Sie die Frage auffrischen könnten. Vielen Dank! – jDelforge

Antwort

1

Sie wahrscheinlich Ihre eigene Flagge in diesem Fall einrichten müssen. zum Beispiel:

app.controller('programController', function($scope, progService) { 

    $scope.programDisplay = false; 

    progService.getProgram().then(function(res){ 
     $scope.program = res.data; 
     angular.element(document).ready(function() { 
      $scope.programDisplay = true; 
     }); 
    }); 
}); 

dann

<div ng-if="program.acf.exerpt && programDisplay"></div> 
+0

Nun endlich funktioniert es, aber ** nur wenn ** ich ein setTimeout um '$ scope.programDisplay = true;' setze, sogar bei 1 Millisekunde. !! Vielen Dank ! – jDelforge

+1

Wie sieht es aus, wenn es nicht funktioniert, wenn Sie setTimeout nicht verwenden? kannst du es beschreiben? –

+0

Wenn ich setTimeout nicht verwende, scheint es, dass das Flag immer wahr ist (ab der zweiten Anfrage), niemals falsch, so dass die Animation nicht erneut ausgelöst wird. Das Setzen einer Millisekunden-Lücke macht den Unterschied ... Der gleiche Trick ist mit der anderen Antwort von Yavor Ivanov – jDelforge

2

Ihre Ansicht nicht aktualisiert, da Sie das gleiche, im Cache gespeicherten Objekt vorbei sind. Um den $ Watcher von ngIf auszuführen, sollten Sie ein "neues"/neues Objekt bereitstellen. Sie müssten wahrscheinlich auch den Zustand ändern, weil ngIf wahr oder falsch erwarten würde.

app.controller('programController', function($scope, progService) { 
    $scope.program = null; 
    progService.getProgram().then(function(res){ 
     $scope.program = angular.copy(res.data); // Returns a copy of the object. Always a new object! 
    }); 
}); 
+0

Danke Javor. Aber die Animation retriggert nur, wenn ich ein kurzes * setTimout * um '$ scope.program = angular.copy (res.data);' ** oder ** 'angle.element (document) .ready (function() {' + '}); um es herum. ** Aber dann ** für beide Tricks scheint die erste Anfrage viel länger. – jDelforge

+1

Sie sollten vermeiden, setTimeout in Angular zu verwenden. Es gibt Abstraktion über es und heißt $ Timeout-Dienst, sollten Sie es anstelle von reinem setTimeout verwenden: https://docs.angularjs.org/api/ng/service/$timeout Und, ja, wenn Ihr Dienst verspottet ist/macht keinen AJAX-Aufruf wahrscheinlich erhalten Sie keine Animation, weil Sie einen Sync-Code haben. Timeout zum Anzeigen der Animation sollte in Ordnung sein, um die Animation auszulösen –

+1

Auch von Ihrem Schreiben sehe ich, dass es DOM möglicherweise noch nicht fertig ist. Workarounds sind also die Verwendung von .ready() oder $ timeout/setTimeout. –