Hinweis: Ich habe diese Frage auch hier in der AngularJS-Mailingliste veröffentlicht: https: // groups .google.com / forum / #! topic / angle / UC8_pZsdn2U

Hallo zusammen,

Ich baue meine erste AngularJS-App und bin mit Javascript zunächst nicht sehr vertraut, daher wird jede Anleitung sehr geschätzt :)

Meine App verfügt über zwei Controller, ClientController und CountryController. In CountryController rufe ich eine Liste von Ländern von einem CountryService ab, der das $ resource-Objekt verwendet. Dies funktioniert gut, aber ich möchte die Liste der Länder mit dem ClientController teilen können. Nach einigen Recherchen habe ich gelesen, dass ich den CountryService verwenden sollte, um die Daten zu speichern und diesen Service in beide Controller einzufügen.

Dies war der Code, den ich vorher hatte:

CountryService:

services.factory('CountryService', function($resource) {
    return $resource('http://localhost:port/restwrapper/client.json', {port: ':8080'});
});

CountryController:

//Get list of countries         
//inherently async query using deferred promise
$scope.countries = CountryService.query(function(result){       
        //preselected first entry as default
    $scope.selected.country = $scope.countries[0];  
});

Und nach meinen Änderungen sehen sie so aus:

CountryService:

services.factory('CountryService', function($resource) {
    var countryService = {};

    var data;
    var resource = $resource('http://localhost:port/restwrapper/country.json', {port: ':8080'});

    var countries = function() {
        data = resource.query();
        return data;
    }

    return {
        getCountries: function() {
            if(data) {
                console.log("returning cached data");
                return data;
            } else {
                console.log("getting countries from server");
                return countries(); 
            }

        }
    };
  });

CountryController:

$scope.countries = CountryService.getCountries(function(result){
        console.log("i need a callback function here...");
});

Das Problem ist, dass ich früher die Rückruffunktion in $ resource.query () verwenden konnte, um eine Standardauswahl vorzuwählen, aber jetzt, da ich den Aufruf von query () in meinen CountryService verschoben habe, schien ich verloren zu haben, was .

Was ist der beste Weg, um dieses Problem zu lösen?

Danke für deine Hilfe, Shaun

7
shaunlim 7 Okt. 2012 im 23:45

4 Antworten

Beste Antwort

Ok..so sieht es so aus, als hätte ich das Problem gelöst, indem ich eine Rückruffunktion bis zum Aufruf resource.query () übergeben habe. Ich bin mir immer noch nicht sicher, ob dies der beste Weg ist, dies zu tun.

Als Referenz habe ich Folgendes getan:

CountryController:

$scope.countries = CountryService.getCountries(function(){
    //preselected default
    $scope.selected.country = $scope.countries[0];  
});

CountryService:

//Country Service. Will contain all relevant rest methods here
services.factory('CountryService', function($resource) {
    var countryService = {};

    var data;
    var resource = $resource('http://localhost:port/restwrapper/country.json', {port: ':8080'});

    var countries = function(callback) {
        data = resource.query(callback);
        return data;
    }


    return {
        getCountries: function(callback) {
            if(data) {
                console.log("returning cached data");
                return data;
            } else {
                console.log("getting countries from server");
                return countries(callback); 
            }

        }
    };
  });
4
shaunlim 8 Okt. 2012 im 21:34

AngularJS verfügt über eine eigene Methode zum Zwischenspeichern von Abfragen, die Sie verwenden sollten. Für den Rückruf ist es sinnlos, die Abfrage einer Variablen zuzuweisen, da ein Versprechen trotzdem zurückgegeben wird. Sie sollten einfach immer ein Versprechen erwarten und Ihren Rückruf innerhalb des Erfolgs oder schließlich weitergeben.

0
Gepsens 28 Juni 2014 im 20:43

In diesem neuen Szenario können Sie einen $ scope. $ Watch verwenden. Sie verwenden es wie folgt.

$scope.countries = CountryService.getCountries();

$scope.$watch('countries',function(newValue){
//need to check if newValue has a value because 
//the first time watch fires it will be undefined.
    if(newValue && newValue.length > 0 ){
        $scope.selected.country = $scope.countries[0];
    }
});

Hoffe das hilft.

0
ganaraj 8 Okt. 2012 im 10:39

Sie sollten sich den $ q-Service ansehen. Sie können Folgendes tun:

promise.then(callback);

Ab 1.1.3 können Sie mit $then auf Versprechen zugreifen, zum Beispiel mit resource.query().$then(callback);

1
Guillaume86 7 Mai 2013 im 20:09