7

我有以下要转换为服务的功能。

我将如何将 $resource 调用提取到 AngularJS 服务中,我将如何调用该服务?

self.select = function (email) {
    var Player = $resource('/player/get',{email:email});
    var player = Player.get(function() {
        self.selectedPlayer.email = player.email;
        self.selectedPlayer.fuel = player.fuel;
        self.selectedPlayer.cargo = player.cargo;
        self.selectedPlayer.food = player.food;
    });
}

谢谢!

4

2 回答 2

18

我怀疑您正在使用 0.9.19 版本。我首先建议您转到 1.0rc4 版本。1.0 版即将上线且稳定,但与 0.9 版相比有许多重大变化。您可以查看Angular 文档以获取更多信息。

在 v1.0 中,您将所有内容包装在一个模块中:控制器、服务、指令等。像这样创建一个模块:

var module = angular.module('ModuleName', ['ngResource']);

在 1.0 版中,资源服务被分解到它自己的类中,因此您必须将其作为依赖项提供。您还必须在应用程序中包含资源 js文件。

现在要创建一个服务,您可以简单地使用模块 API。在这种情况下:

module.factory('Player', ['$resource', function($resource) {
   return $resource('/player/get');}]);

注意这里对 $resource 的依赖是由 angular 注入的。

就我个人而言,我不喜欢弄乱我的服务中的范围,所以我的控制器中有以下内容:

module.controller('MyController', ['$scope', 'Player', function($scope, Player) {
    $scope.select = function(email) {
        console.log("selecting");
        Player.get({
        email: email
        }, function(player) {
            $scope.selectedPlayer = player;
        });
    };
}]);​

请注意,在 v1.0 中,作用域也被注入到控制器中,因此不再使用 self 。我还冒昧地假设 selectedPlayer 只包含来自 player 的字段,所以我只是在 selectedPlayer 的顶部直接写了 player。您也可以手动逐个字段地执行此操作,或用于angular.extend($scope.selectedPlayer, player);合并两个对象。

这是一个小提琴:http: //jsfiddle.net/DukvU/

于 2012-04-07T04:55:34.037 回答
11
angular.module('myModule', []).
  factory('Player', function($resource) {
    return $resource('/player/get',{email:email});
  });

function MyController($scope, Player) {
   $scope.select = function(email) {
     Player.get(....);
   }
}
于 2012-04-07T04:43:22.990 回答