2012-04-06 39 views
7

Tôi có chức năng sau đây mà tôi muốn chuyển đổi sang một dịch vụ.Chuyển đổi một chức năng AngularJS sang dịch vụ

Tôi làm cách nào để trích xuất lệnh gọi tài nguyên $ thành dịch vụ AngularJS và tôi sẽ gọi dịch vụ này như thế nào?

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

Cảm ơn!

Trả lời

18

Tôi nghi ngờ rằng bạn đang làm việc ra phiên bản 0.9.19. Trước tiên tôi sẽ đề nghị bạn chuyển sang phiên bản 1.0rc4. Phiên bản 1.0 sắp hoạt động và ổn định nhưng nó có nhiều thay đổi đột phá so với phiên bản 0.9. Bạn có thể xem số Angular documentation để biết thêm thông tin.

Trong v1.0 bạn bao bọc mọi thứ trong một mô-đun: bộ điều khiển, dịch vụ, chỉ thị, v.v. Tạo một module như vậy:

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

Trong phiên bản 1.0 các dịch vụ tài nguyên là yếu tố ra vào lớp học của riêng mình, vì vậy bạn phải cung cấp cho nó như là một sự phụ thuộc. Bạn cũng sẽ phải bao gồm tệp resource js trong ứng dụng của mình.

Bây giờ để tạo một dịch vụ, bạn có thể chỉ cần sử dụng API mô-đun. Trong trường hợp này:

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

Chú ý ở đây rằng sự phụ thuộc vào tài nguyên $ được tiêm bởi góc.

Cá nhân tôi không thích để gây rối với phạm vi bên trong dịch vụ của tôi vì vậy tôi sẽ có sau bên trong bộ điều khiển của tôi:

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

Lưu ý rằng trong v1.0 phạm vi cũng được tiêm vào bộ điều khiển để không sử dụng bản thân nữa. Ngoài ra tôi đã tự do giả định rằng các lựa chọnPlayer sẽ chỉ chứa các lĩnh vực từ máy nghe nhạc vì vậy tôi chỉ viết cầu thủ thẳng trên đầu củaPlayer được chọn. Bạn cũng có thể thực hiện theo trường theo cách thủ công hoặc sử dụng angular.extend($scope.selectedPlayer, player); để hợp nhất hai đối tượng.

Đây là một fiddle: http://jsfiddle.net/DukvU/

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

function MyController($scope, Player) { 
    $scope.select = function(email) { 
    Player.get(....); 
    } 
} 
Các vấn đề liên quan