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);
});
};
});
我已经阅读了几篇关于使用 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);
});
};
});