如何将 $resource 转换为 $http?

how to convert $resource to $http?

如何将我对 $resource 的使用转换为利用原始 $http 服务? $resource 究竟做了哪些 $http 没有做的事情?

return $resource(API_LINK+'/api/users/', {
   id: '@_id'
 },
 {
   changePassword: {
     method: 'PUT',
     params: {
       controller:'password'
     }
   },
   get: {
     method: 'GET',
     params: {
       id:'me'
     }
   })

$resource 只是对 $http 的抽象,认为 API 可以方便地用于 RESTful 端点。没有什么 $resource 不能用 $http 写的。在利用 $http 的工厂中编写上述内容的方法可能包括...

// assumption that API_LINK is an injectable constant
.factory('MyService', function(API_LINK, $http) {

    function changePassword(params) {
        return $http.put(API_LINK +'/api/users/', params);
    }

    function get(id) {
        return $http.get(API_LINK +'/api/users?id=' + id);
    }

    return {
        changePassword: changePassword,
        get: get
    }
});

使用以下用法...

.controller('ctrl', function($scope, MyService) {

    MyService.get('me').then(function(response) {
        // ...
    });

    MyService.changePassword({ controller: 'password' }).then(function(response) {
        // ...
    });
});

如果您需要完全控制涉及 promise 解析的工厂功能,我建议您查看 AngularJS $q API

我们也可以用另一种方式来做:

get: function() {
    var id = 'me';
    $http.get(API_LINK + '/api/users/' + id )
      .success(function(response) {
        defer.resolve(response);
      })
      .error(function(err) {
        console.log('err', err);
        defer.reject(err);
      });
    return defer.promise;
  },

  changePassword: function() {
    $http.put(API_LINK + '/api/users/', {controller:'password'} )
      .success(function(response) {
        defer.resolve(response);
      })
      .error(function(err) {
        console.log('err', err);
        defer.reject(err);
      });

    return defer.promise;
  }