在下面的示例中,$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
});
}
});
答案 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