Angularjs 我的$scope.variable正在更改,但它';HTML上没有出现($scope.$apply)
我有以下代码:Angularjs 我的$scope.variable正在更改,但它';HTML上没有出现($scope.$apply),angularjs,Angularjs,我有以下代码: var meme = angular.module('testApp'); meme.controller('awsCtrl', ['$scope', function ($scope) { $scope.myDate = 'Hello there!'; $scope.testSend1Response = ''; //----- //--set up configuration for AWS //----- var creden
var meme = angular.module('testApp');
meme.controller('awsCtrl', ['$scope', function ($scope) {
$scope.myDate = 'Hello there!';
$scope.testSend1Response = '';
//-----
//--set up configuration for AWS
//-----
var credentials = new AWS.Credentials('AKIAI4UYCXVJ2FJICSHA', 'Sj42vmNla34trodyrvIcVIkbo+mczVo5QMIlfVHg');
AWS.config.region = "ap-southeast-2";
AWS.config.credentials = credentials;
//-------------------------------------------------------------------------
//--send message
//-------------------------------------------------------------------------
$scope.testSend1 = function() {
var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
var params = {
DelaySeconds: 10,
MessageAttributes: {
"Title": {
DataType: "String",
StringValue: "The Whistler"
},
"Author": {
DataType: "String",
StringValue: "John Grisham"
},
"WeeksOn": {
DataType: "Number",
StringValue: "6"
}
},
MessageBody: "Information about current NY Times fiction bestseller for week of 12/11/2016.",
QueueUrl: 'https://sqs.ap-southeast-2.amazonaws.com/448283262740/reporting'
};
sqs.sendMessage(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
$scope.testSend1Response = ' Success. MessageId: ' + data.MessageId; // << THE PROBLEM IS HERE
console.log("Success", $scope.testSend1Response);
console.log('Success2 ' + data.MessageId);
}
});
}
}]);
当我点击按钮时,响应不会以HTML格式打印,而我希望它能够打印出来,但在控制台日志中我可以看到一个MessageId,比如说
1aacc
,当我第二次点击按钮时,1aacc
以HTML格式打印,但在控制台日志中我可以看到一个MessageId2bbdd
,因此,$scope.testSend1Response
似乎在日志后面,它向我显示了以前的消息ID,而不是当前的消息ID。发生这种情况的原因是Angular没有“消化”这一更改,这意味着Angular不知道该变量在该区域会发生变化,因此当函数完成运行时,Angular已经完成其消解循环,现在范围变量$scope.testSend1Response已设置,但Angular不知道或无法识别它
如果在javascript超时函数中更改范围变量,也会发生同样的情况。
但是,异步Angular服务,例如$http
,默认情况下由Angular进行包装和消化
解决该问题的方法是将该变量包装在$apply
函数中,如下所示:
sqs.sendMessage(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
$scope.$apply(function() {
$scope.testSend1Response = ' Success. MessageId: ' + data.MessageId;
});
console.log("Success", $scope.testSend1Response);
console.log('Success2 ' + data.MessageId);
}
});
查看Jim Hoskins的这篇精彩文章,了解更多信息:
<button ng-click="testSend1()"> Send data </button>
<span> Response: {{testSend1Response}}</span>
sqs.sendMessage(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
$scope.$apply(function() {
$scope.testSend1Response = ' Success. MessageId: ' + data.MessageId;
});
console.log("Success", $scope.testSend1Response);
console.log('Success2 ' + data.MessageId);
}
});