一尘不染

AngularJS:使用共享服务(带有$ resource)在控制器之间共享数据,但是如何定义回调函数?

angularjs

注意:我也在以下AngularJS邮件列表中发布了此问题:https
://groups.google.com/forum/#!
topic/
angular/UC8_pZsdn2U

大家好,

我正在构建我的第一个AngularJS应用,并且对Javascript不太熟悉,因此任何指导都将不胜感激:)

我的应用程序有两个控制器,ClientController和CountryController。在CountryController中,我正在从使用$
resource对象的CountryService检索国家列表。这工作正常,但我希望能够与ClientController共享国家/地区列表。经过一些研究,我读到我应该使用CountryService来存储数据并将该服务注入两个控制器中。

这是我以前的代码:

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];  
});

在我更改之后,它们如下所示:

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...");
});

问题是我曾经能够使用$
resource.query()中的回调函数来预先选择默认选择,但是现在我将query()调用移到了CountryService内,我似乎丢失了什么。

解决此问题的最佳方法是什么?

感谢您的帮助,肖恩


阅读 231

收藏
2020-07-04

共1个答案

一尘不染

Ok..so看起来我通过将回调函数一直传递到resource.query()调用解决了问题。仍不确定这是否是最佳方法。

供参考,这是我所做的:

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); 
            }

        }
    };
  });
2020-07-04