将数据从http分配给'this'控制器

时间:2015-03-09 00:58:47

标签: angularjs http

我正在尝试进行$ http调用并将返回的数据分配给变量。目前我有这个代码,它工作正常。

这是我的控制器内部:

.controller('sample', ['$scope', '$http', function($scope, $http){
    var ctrl = this;

    $http.get('somejson.json').success(function(data){
         $scope.myData = data;
    });
});

但是,我不想将其分配给$ scope,而是将其分配给我的控制器变量。但是在我的get函数中,ctrl总是未定义的。我在这里错过了什么吗?我尝试从角度阅读文档,但没有运气。谢谢!

这不起作用:

.controller('sample', ['$scope', '$http', function($scope, $http){
        var ctrl = this;

        $http.get('somejson.json').success(function(data){
             debugger;// when I type ctrl in console, just to check, ctrl is undefined.
             ctrl.myData = data; // ctrl is undefined. is it possible to do this?
        });
    });

3 个答案:

答案 0 :(得分:0)

它完美地适用于这个小提琴。

 app.controller('myController', ['$scope', '$http', function($scope, $http) {
    var ctrl = this;

    $http.get('https://dl.dropboxusercontent.com/u/94145612/example.json').success(function(data
         ctrl.myData = data; // ctrl is undefined. is it possible to do this?
    });
 }]);

http://jsfiddle.net/r25akef3/1/

答案 1 :(得分:0)

不确定为什么它不起作用,但我几乎可以完全确定它是不是,因为ctrl未定义。将this分配给另一个变量应该可以正常工作:

var ctrl = this;

$http.get('somejson.json').success(function(data){
     ctrl.myData = data;
});

另一种选择是使用.bind()

$http.get('somejson.json').success(function(data){
    this.myData = data; // ctrl is undefined. is it possible to do this?
}.bind(this));

我更喜欢第一种方法。

答案 2 :(得分:0)

  

注意:控制台仅使变量可访问,这两者都是定义的   在全局或当前正在执行的功能范围内。

第一种情况

.controller('sample', ['$scope', '$http', function($scope, $http){

        // since it is declared as var ctrl , here it gets function scope.
        var ctrl = this;

        $http.get('somejson.json').success(function(data){
             debugger;

             // when application is paused in debugger mode, it will be accessible for that instance
             // once debugger mode is gone, console shifts current context, and doesn't make ctrl accessible


             ctrl.myData = data;
        });
    });

第二个案例

.controller('sample', ['$scope', '$http', function($scope, $http){

        // since there is no declaration as var ctrl , here it gets global scope.
        ctrl = this;

        $http.get('somejson.json').success(function(data){
             debugger;


             // ctrl will be accessible in console

             ctrl.myData = data;
        });
    });