Ich verwende einige Daten, die von einem RESTful-Dienst stammen, auf mehreren Seiten. Dafür benutze ich eckige Fabriken. Daher musste ich die Daten einmal vom Server abrufen und jedes Mal, wenn ich die Daten mit diesem definierten Dienst abrufe. Genau wie eine globale Variable. Hier ist das Beispiel:
var myApp = angular.module('myservices', []);
myApp.factory('myService', function($http) {
$http({method:"GET", url:"/my/url"}).success(function(result){
return result;
});
});
In meinem Controller verwende ich diesen Dienst als:
function myFunction($scope, myService) {
$scope.data = myService;
console.log("data.name"+$scope.data.name);
}
Es funktioniert gut für mich gemäß meinen Anforderungen. Das Problem hierbei ist jedoch, dass beim erneuten Laden meiner Webseite der Dienst erneut aufgerufen wird und Server angefordert werden. Wenn zwischenzeitlich eine andere Funktion ausgeführt wird, die vom "definierten Dienst" abhängt, wird der Fehler ausgegeben, als ob "etwas" undefiniert ist. Ich möchte also in meinem Skript warten, bis der Dienst geladen ist. Wie kann ich das machen? Gibt es das überhaupt in Angularjs?
quelle
function myFunction($scope, myService) { var myDataPromise = myService.getData(); myDataPromise.then(function(result) { $scope.data = result; console.log("data.name"+$scope.data.name); }); console.log("This will get printed before data.name inside then. And I don't want that."); }
Für Neulinge können Sie auch einen Rückruf verwenden, zum Beispiel:
In Ihrem Dienst:
In Ihrem Controller:
quelle
Zu Ihrer Information, dies verwendet Angularfire, so dass es für einen anderen Dienst oder eine andere Verwendung etwas variieren kann, aber das gleiche Problem lösen sollte, das $ http hat. Ich hatte die gleiche Problemlösung, die für mich am besten geeignet war, alle Dienstleistungen / Fabriken in einem einzigen Versprechen über den Umfang zu kombinieren. Auf jeder Route / Ansicht, auf der diese Dienste / usw. geladen werden mussten, habe ich alle Funktionen, die geladene Daten erfordern, in die Controller-Funktion eingefügt, z. B. myfunct () und die Haupt-App.js, die nach der Authentifizierung ausgeführt werden
und in der Ansicht habe ich gerade getan
im ersten / übergeordneten Ansichtselement / Wrapper, damit der Controller alles darin ausführen kann
ohne sich um asynchrone Versprechen / Bestell- / Warteschlangenprobleme zu kümmern. Ich hoffe, das hilft jemandem mit den gleichen Problemen, die ich hatte.
quelle
Ich hatte das gleiche Problem und keines, wenn diese für mich funktionierten. Hier ist, was funktioniert hat ...
und dann ist die Funktion, die es verwendet, ...
Der Service ist nicht so notwendig, aber ich denke, es ist eine gute Praxis für die Erweiterbarkeit. Das meiste, was Sie für einen benötigen, wird für jeden anderen verwendet, insbesondere wenn Sie APIs verwenden. Jedenfalls hoffe ich, dass dies hilfreich war.
quelle