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格式打印,但在控制台日志中我可以看到一个MessageId
2bbdd
,因此,
$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);
    }
  });