在$ http.get调用中获取服务上下文

时间:2013-10-17 17:07:59

标签: javascript angularjs angular-services

在下面的示例中,$http.get().success()调用中的上下文为undefined。 我想这是因为我使用“严格使用”;并且success()是常规功能。

但是我需要在函数调用中访问服务的上下文。 实现这个目标的正确方法是什么?

ng_app.service('database', function($http)
{
    this.db = new Db();
    this.load = function()
    {
        console.log(this); // logs the service context correctly
        $http.get('get_nodes/').success(function(ajax_data)
        {
            console.log(this); // logs "undefined"
            console.log(this.db); // throws an exception because this is undefined
            this.db.nodes = ajax_data; // throws an exception because this is undefined
        });
    }
});

2 个答案:

答案 0 :(得分:2)

通常,您将设置上下文变量:

this.db = new Db();
var that = this;
this.load = function()
{
    console.log(this); // logs the service context correctly
    $http.get('get_nodes/').success(function(ajax_data)
    {
        console.log(that); 
        console.log(that.db); 
        that.db.nodes = ajax_data; 
    });

我知道jQuery的$.ajax有一个context属性,不知道Angulars $http是否存在类似的东西,所以这就是我一直在做的。

答案 1 :(得分:0)

你必须使用有角度的承诺来实现这一点。

angular.module('myapp', [])
  .service('Github', function($http, $q) {
    this.getRepositories = function() {
      var deferred = $q.defer();
      $http.get('https://api.github.com/users/defunkt')
        .success(function(response) {
          // do stuffs with the response
          response.username = response.login + ' ' + response.name;
          // like filtering, manipulating data, decorating data found from from api
          // now pass the response
          deferred.resolve(response);
        }).error(function(response) {
          deferred.resolve(response);
        });
      return deferred.promise;
    }
  })
  .controller('MainCtrl', function($scope, Github) {
    Github.getRepositories().then(function(dt) {
      $scope.user = dt;
    });
  });

我创造了一个可以使用的弹药: http://plnkr.co/edit/r7Cj7H