2014-11-19 5 views
5

Ich benutze angularjs und ich kann nicht erhalten den folgenden Controller in einer $ Scope-Variable die Daten von einer AJAX Anfrage an Flickr zurückgegeben zu speichern. Die $http.get ruft eine lokal gespeicherte JSON-Datei auf. Bei Erfolg wird der in success() zurückgegebene JSON verwendet, um die entsprechende URL für den AJAX-Aufruf an die Flickr-API zu ermitteln. Bei Erfolg dieses Anrufs protokolliere ich die Daten auf der Konsole. So weit, so gut, es gibt eine Reihe von drei Objekten zurück. Ich versuche jedoch, dieses Array auf eine $ Scope-Variable ($scope.photos) zu setzen, damit ich meine Ansichtsvorlage durchlaufen kann. Jedoch, wenn ich versuche, {{photos}} in der HTML-Ausgabe auszugeben, gibt es nichts. Ich vermute, dass dies ein Versprechensproblem ist, und die Vorlage wird gerendert, bevor der AJAX die Daten von Flickr zurückgibt, aber ich habe die Dokumente ohne Erfolg überflutet (siehe $q ein wenig). Ich bin Angular etwas neu und würde Ihre Einsicht schätzen. Vielen Dank!

artistControllers.controller('PhotoController', ['$scope', '$http', '$routeParams', '$q', function ($scope, $http, $routeParams, $q){ 
    $http.get('js/data.json').success(function(data){ 
    $scope.artists = data; 
    $.ajax({ 
     type : "GET", 
     dataType : "jsonp", 
     url : $scope.artists[$routeParams.itemId].flickr, 
     success: function(flickr){ 
      $scope.photos = flickr.items; 
      console.log($scope.photos); 
     } 
    }); 
    }); 
}]); 
+2

Warum jQuery anstelle von '$ http' verwenden? – Phil

+0

Eine gültige Frage @Phil, siehe unten für ähnliche Kommentare. Eine kurze Antwort ist, dass ich (noch) keinen Flickr ohne $ .ajax erfolgreich aufrufen konnte. – FugueWeb

+2

Hier ist eine Antwort, die Ihrem flickr-Problem helfen könnte: http://stackoverflow.com/questions/20720547/cant-use-angular-to-show-json-from-flickr –

Antwort

1

Vielen Dank für Ihre Hilfe und Ihr Feedback. Ich habe eine Lösung mit $ q und $ http.jsonp, teilweise dank dieses Tutorial gefunden:

http://youtu.be/gApduktFwxw?t=17m

Hier mein Code ist zu beachten, dass meine API url String flickr hat &jsoncallback=JSON_CALLBACK daran angehängt:

$http.get('js/data.json').success(function(data){ 
    $scope.artist = data[$routeParams.itemId]; 
    var url = $scope.artist.flickr; 
    console.log(url); 

    $scope.init = function(){ 
     $scope.getImages() 
     .then(function(res){ 
      console.log(res); 
     }, function(status){ 
      console.log(status); 
     }); 
    }; 

    $scope.getImages = function(){ 
     var defer = $q.defer(); 

     $http.jsonp(url) 
      .success(function(res){ 
       defer.resolve(res); 
       console.log(res); 
      }).error(function(status, err){ 
       defer.reject(status); 
       console.log(err); 
      }); 

     return defer.promise;   
    }; 

    $scope.init(); 
6

Weil Sie Code außerhalb von Angular Wissen Ausführung sind, müssen Sie manuell $scope.$digest() dafür nennen, um die Änderung zu „sehen“ und das Markup entsprechend zu aktualisieren.

ändern Sie einfach Ihren Erfolg Handler:

success: function(flickr){ 
    $scope.photos = flickr.items; 
    $scope.$digest(); 
} 

Hinweis: $scope.$apply() würde auch funktionieren, weil es ein $digest jeden einzelnen Bereich in der Anwendung des Fall ist, von dem $rootScope nach unten beginnen. Bei einer großen Anwendung kann dies viel langsamer als nötig sein. Daher empfehle ich in Ihrem Fall, nur aus dem Bereich, den Sie gerade ändern, zu verdauen.

+0

Dies funktionierte, danke! – FugueWeb

+3

Dies ist nicht ideal. Sie sollten '$ digest' nicht manuell aufrufen müssen. '$ http' macht das für Sie. –

+2

Korrekt. Ich hätte erwähnen sollen, dass es besser wäre, stattdessen den Angular-Dienst "$ http" zu verwenden. Wenn Sie jedoch die jQuery '.ajax()' Methode verwenden müssen, müssen Sie '$ scope. $ Digest()' selbst ausführen. – GregL

8

Verwenden Sie nicht jQuery.ajax. Angulars $http kann JSONP auch tun. Sie können mehr über here lesen.

artistControllers.controller('PhotoController', ['$scope', '$http', '$routeParams', '$q', function ($scope, $http, $routeParams, $q){ 
    $http.get('js/data.json').success(function(data){ 
    $scope.artists = data; 
    $http.jsonp($scope.artists[$routeParams.itemId].flickr).success(function(data){ 
     $scope.photos = flickr.items; 
     console.log($scope.photos); 
    }); 
    }); 
}]); 
+0

Ich schaue in $ http.jsonp, aber ich konnte noch nicht arbeiten, während $ .AJAX tut. Wir werden uns weiterhin für eine reine Angular-Implementierung einsetzen. – FugueWeb

+2

Hier ist eine zufällige Datei, die zeigt, wie man es benutzt: http://jsfiddle.net/subhaze/a4Rc2/114/ –

Verwandte Themen