angularjs - 动态资源头

标签 angularjs angular-resource

我希望服务提供资源,如下面的代码所示:

   angular.module('myApp.userService', ['ngResource'])
  .factory('UserService', function ($resource)
  {
    var user = $resource('/api/user', {},
          {
            connect: { method: 'POST', params: {}, isArray:false }
          });
    return user;
  }

然后当使用connect Action ,我想动态传递一个 HTTP header ,这意味着它可能会因每次调用而改变。这是一个示例,在 Controller 中,请参阅代码中的注释:

 $scope.user = UserService;

 $scope.connect = function ( user )
        {
          var hash = 'Basic ' + Base64Service.encode(user.login + ':' + user.password);

          // I would like this header to be computed 
          // and used by the user resource
          //  each time I call this function
          $scope.user.headers = [{Authorization: hash}];

          $scope.user.connect( {},
              function()
              {
                  // successful login
                  $location.path('/connected');
              }
              ,function()
              {
                  console.log('There was an error, please try again');
              });
       }

您知道直接或通过技巧来做到这一点的方法吗?

最后的想法

接受的答案并没有完全回答这个问题,因为标题不是完全动态的,因为工厂实际上返回了一个工厂(!),这在我的代码中并非如此。

由于 $resource 是一个工厂,因此无法使其动态化。

每次用户连接时,我最终都会销毁资源对象。这样,我就可以在用户连接时计算带有 header 的资源。

@Stewie 提供的解决方案对此很有用,因此我将其保留为已接受。

这是我进行连接的方式,当(重新)连接时资源被破坏/重新创建时,它可以多次使用:

 this.connect = function (user)
 {
    self.hash = 'Basic ' + Base64Service.encode(user.login + ':' + user.password);
console.log("CONNECT login:" + user.login + " - pwd:" + user.password + " - hash:" + self.hash);

if (self.userResource)
{
  delete self.userResource;
}

self.userResource = $resource('/api/user/login', {}, {
  connect: {
    method: 'POST',
    params: {},
    isArray: false,
    headers: { Authorization: self.hash }
  }
});

var deferred = $q.defer();
self.userResource.connect(user,
  function (data)
  {
    //console.log('--------- user logged in ----- ' + JSON.stringify(data));
    // successful login
    if (!!self.user)
    {
      angular.copy(data, self.user);
    }
    else
    {
      self.user = data;
    }

    self.setConnected();

    storage.set('user', self);

    deferred.resolve(self);
  },
  function (error)
  {
    self.user = {};
    self.isLogged = false;

    storage.set('user', self);

    deferred.reject(error);
  }
);

return deferred.promise;

};

最佳答案

从 angularjs v1.1.1 和 ngResource v.1.1.1 开始,这可以使用 headers 来完成。 $resource 的属性(property) Action 对象。

您可以将资源包装在一个函数中,该函数接受自定义 header 作为参数并返回 $resource在适当的操作定义中设置自定义 header 的对象:

PLUNKER

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

app.controller('AppController',
  [
    '$scope',
    'UserService',
    function($scope, UserService) {
      $scope.user = {login: 'doe@example.com', password: '123'};

      $scope.connect = function() {
        // dropping out base64 encoding here, for simplicity
        var hash = 'Basic ' + $scope.user.login + ':' + $scope.user.password;
        $scope.user.headers = [{Authorization: hash}];

        UserService({Authorization: hash}).connect(
          function () {
            $location.url('/connected');
          },
          function () {
            console.log('There was an error, please try again');
          }
        );

      };

    }
  ]
);

app.factory('UserService', function ($resource) {
  return function(customHeaders){
    return $resource('/api/user', {}, {
      connect: { 
        method: 'POST',
        params: {},
        isArray: false,
        headers: customHeaders || {}
      }
    });
  };

});

关于angularjs - 动态资源头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20566593/

相关文章:

AngularJS 转换到抽象状态

angularjs - 使用 angularJs 资源下载 XML 文件

javascript - AngularJS $resource 在使用方法 :POST 时调用了错误的 API URL

javascript - 用于具有不同端点的嵌套 api 资源的 AngularJs ngResource

angularjs - angulars $resource 是否支持 etags?

javascript - 错误 : message. $delete 不是函数

javascript - AngularJS:如何获取 $http 结果作为函数的返回值?

javascript - 一个 root-app 内有多个 ng-app

javascript - 允许 Angular Controller 或 View 中使用 html 标签

javascript - 如何调试 Angular 库错误?