将AngularJS函数转换为服务

时间:2012-04-06 13:46:26

标签: javascript angularjs

我有以下功能,我想转换为服务。

如何将$ 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;
    });
}

谢谢!

2 个答案:

答案 0 :(得分:18)

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

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

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

在版本1.0中,资源服务被分解到它自己的类中,因此您必须将其作为依赖项。您还必须在应用中添加resource 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只包含播放器中的字段,所以我只是将玩家直接写在selectedPlayer的顶部。您也可以手动逐个字段或使用angular.extend($scope.selectedPlayer, player);合并两个对象。

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

答案 1 :(得分:11)

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

function MyController($scope, Player) {
   $scope.select = function(email) {
     Player.get(....);
   }
}