Ich versuche, eine einzige $http
Anfrage, um eine meiner JSON-Dateien zu erhalten und die Daten über alle meine Controller zu verwenden.Share async Daten zwischen Controllern ohne mehrere Anfragen
Ich habe auf egghead.io gesehen, wie man Daten über mehrere Controller verteilt, und ich habe auch diese StackOverflow Frage gelesen: "Sharing a variable between controllers in angular.js".
Die Antworten dort verwenden jedoch nicht das Modul $http
. Wenn Sie $http
verwenden, verfügen die Controller nicht über die Daten, an denen sie arbeiten müssen. Zum Zeitpunkt des Empfangs der Antwort ist es bereits zu spät.
Ich fand dann die Methode $q.defer
und diese Frage auf Stackoverflow: „AngularJS share asynchronous service data between controllers“
Die Lösung gepostet es funktioniert gut, aber es hat zwei Probleme:
- Jeder Controller löst die
$http
Anfrage die gleichen Daten erhalten, die bereits in einem anderen Controller verwendet wurden; und, - Wenn ich versuche, die empfangenen Daten zu manipulieren, habe ich eine
then
Funktion.
Unten können Sie meinen Code sehen:
controllers.js
'use strict';
/* Controllers */
function appInstallerListCtrl($scope, Data) {
$scope.apps = Data;
}
function appInstallerDetailCtrl($scope, $routeParams, Data) {
$scope.appId = $routeParams.appId;
$scope.apps = Data;
console.log($scope.apps); // <-- then function
console.log(Data); // <-- then function with $vv data returned but I can't access it
for (var i in $scope.apps) // <--- no way, baby!
console.log(i);
}
app.js
var app = angular.module('appInstaller', []);
app.factory('Data', function($http, $q) {
var defer = $q.defer();
$http.get('apps.json').then(function(result) {
defer.resolve(result.data.versions.version);
});
return defer.promise;
});
app.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/app', {templateUrl: 'partials/app-list.html', controller: appInstallerListCtrl}).
when('/app/:appId', {templateUrl: 'partials/app-detail.html', controller: appInstallerDetailCtrl}).
otherwise({redirectTo: '/app'});
}]);
Was ich haben möchte, ist, dass Beim Start der App wird die $http
Anfrage p sein Die Antwort wird in der gesamten App auf allen Controllern verwendet.
Dank
Danke, aber der Code ist nicht richtig. Ich erhalte einen Fehler bei: Uncaught SyntaxError: Unerwartetes Token {nach der Data.then und es gibt immer noch die) Klammer. – kiwi1342
Siehe die Dokumentation auf $ q hier http://docs.angularjs.org/api/ng.$q, ich habe gerade die Grundidee hervorgehoben. Ich habe versucht, meinen Code auch zu reparieren. – Chandermani
wow, es funktioniert! vielen Dank und ich werde das Dokument, das Sie markiert haben, überprüfen. – kiwi1342