AngularJS - 在 POST 请求中使用 this 与 $scope

AngularJS - the use of this vs $scope in a POST request

我已经阅读了几篇关于使用 this 而不是 $scope 的帖子,反之亦然,但总的来说,我对 javascript 相当陌生,我觉得我仍然缺少一些东西。

下面是我正在执行 POST request 的代码示例。但是当我进入方法内部时,我的 formData 对象是空的。但是,如果我将它从 this 更改为 $scope,它会起作用,但我很难理解为什么会这样。

代码:

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

app.controller('tableController', function($scope, $http){

    //Empty object that gets filled with data and sent as a POST request.
    this.formData = {};

    // Define process for submitting form
    //TODO: FIND OUT THE DIFFERENCE BETWEEN $SCOPE AND THIS
    this.processForm = function() {
        console.log('Inside processForm method');

        $('#addEntry').modal('hide');
        console.log($scope.formData); //If I use this here - the object is empty
        $http({
            method : 'POST',
            url :'../protocols',
            data : JSON.stringify($scope.formData), 
            headers : {
                'dataType' : "json",
                'contentType' : "application/json"
            }
        })
        .success(function(data) {
            console.log('Success: ' + data);

            //Empties the object after the POST request is done...
            $scope.formData = {}
        })
        .error(function(data){
            console.log('Error ' + data);
        });
    };
});

$scope != this.

'this'是上下文相关的,与他的'direct parent'有关。

如果您使用 'controller as' 语法,则不需要

$scope。

但是,如果您仍想使用 $scope,请在您的控制器中使用 $scope.formData。

你需要意识到 Javascript 有多个 scopes 并且 this 关键字指的是你正在操作的范围。

然后,就像@Henri S 提到的那样,您还应该意识到控制器的作用域,它是一个 JavaScript 构造函数,与您在内部使用的 $scope 不同. Angular 使用的 $scope 是一个与控制器关联的对象,它实际上是一个视图模型。你HTML,在某个控制者的控制下可以'access'这个对象。如果您创建控制器链,$scope 将 prototypically 继承。

如果我们将此应用于您的代码:

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

app.controller('tableController', function($scope, $http){

   var self = this; //We capture a reference/value of the scope of your controller

    this.formData = {};
    this.currentDataObject : {restURL: "../protocols"} 

    // Define process for submitting form
    this.processForm = function() { //Here begins a new javascript scope
        console.log('Inside processForm method');

        $('#addEntry').modal('hide');
        console.log(self.formData); // this will refer to the this.formdata

        $http({
            method : 'POST',
            url : self.currentDataObject.restURL,
            data : JSON.stringify(self.formData), 
            headers : {
                'dataType' : "json",
                'contentType' : "application/json"
            }
        })
        .success(function(data) {
            console.log('Success: ' + data);

            //Empties the object after the POST request is done...
            self.formData = {}
        })
        .error(function(data){
            console.log('Error ' + data);
        });
    };
});