7

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

大家好,

我正在构建我的第一个 AngularJS 应用程序,并且对 Javascript 不是很熟悉,因此非常感谢任何指导:)

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

这是我之前的代码:

国家服务:

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

国家控制器:

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

在我更改之后,它们看起来像这样:

国家服务:

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

        }
    };
  });

国家控制器:

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

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

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

谢谢你的帮助,肖恩

4

4 回答 4

4

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

作为参考,这就是我所做的:

国家控制器:

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

国家服务:

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

        }
    };
  });
于 2012-10-08T21:34:43.157 回答
1

你应该看看$q 服务,你可以这样做:

promise.then(callback);

从 1.1.3 开始,您可以使用 访问 Promise $then,例如resource.query().$then(callback);

于 2012-10-08T14:50:48.107 回答
0

在这个新场景中,您可以使用 $scope.$watch。您使用它的方式如下。

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

希望这可以帮助。

于 2012-10-08T10:39:52.000 回答
0

AngularJS 有它自己的缓存查询方式,你应该使用它。至于回调,将查询分配给变量是没有用的,因为无论如何都会返回一个承诺。你应该总是期待一个承诺,并在成功或最终传递你的回调。

于 2014-06-28T20:43:02.650 回答