9

我需要使用 Angular 从服务器获取一些 JSON 数据。比方说用户数据。我创建了这样的服务:

app.service('User', function($http) {
  retrun $http({method: 'GET', url:'/current_user'});
});

在我的控制器中:

app.controller('SomeCtrl', function($scope, User) {
  User.success(function(data) {
    $scope.user = data;
  });
});

这很好用,但是如果我想向用户添加一些方法怎么办?例如在我想做的视图中{{user.isAdmin()}}。这是正确的方法吗?我在哪里可以添加这些方法?

4

2 回答 2

3

如果您希望您的服务始终使用此方法返回一个对象,请执行以下操作:

app.service('User', function($http) {
  return $http({method: 'GET', url:'/current_user'}).
         then(function(response) {
           response.data.isAdmin = function() { return true; };
           return response.data;
         });
});

现在,任何引用此承诺并使用 .then() 的未来代码都将检索新对象。查看 Promise 文档以获取更多信息。

http://docs.angularjs.org/api/ng .$q

请记住,通过在 httpPromise 上使用“then”,它将被转换为正常的 Promise。您不再拥有“成功”和“错误”的便捷方法。

使用构造函数为您返回的对象创建一个类可能是更好的做法,该构造函数接受数据对象并分配适当的属性(或扩展实例)。这样你就可以简单地做类似的事情

return new User(val);

你会得到你想要的所有方法(带有原型等)。

于 2013-10-10T14:29:48.243 回答
0

您可以在您创建的服务中通过几种方式执行此操作:

  1. 开始使用 $resource 并对响应使用转换:http:
    //jsfiddle.net/roadprophet/prtAP/ ...

    转换响应:函数(数据,标头){

                    data = {};
                    data.coolThing = 'BOOM-SHAKA-LAKA';
                    return data;
                }  
    

...我推荐这种方法,因为它使用 $resource 可以更清晰地扩展。

  1. 使用 $http 设置一个 transformResponse:http: //jsfiddle.net/roadprophet/bPfcz/

  2. 使用您自己的承诺,该承诺在 get 承诺解决但使用映射数据后解决。这可能是最手动的处理方式,因为它需要您管理多个 Promise。

于 2013-10-10T14:55:18.247 回答