2017-07-19 53 views
0

我有這樣的代碼($範圍$適用。):

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); 
     } 
     }); 
    } 
    }]); 

在此區域:

 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); 
     } 
     }); 

我使用AWS sqs發送消息,然後記錄它已發送並指定範圍變量testSend1Response MessageId。

在我的HTML我有:

<button ng-click="testSend1()"> Send data </button> 
<span> Response: {{testSend1Response}}</span> 

當我按一下按鈕,響應不打印它在HTML,我很期待它來獲取打印,但在控制檯日誌中我可以看到說1aacc,當我點擊按鈕第二次,1aacc被印在HTML,但在控制檯日誌中我可以看到的2bbdd中MessageId中MessageId,所以它似乎$scope.testSend1Response是日誌後面,正顯示出我的先前的MessageId而不是當前的。

回答

0

出現這種情況的原因是因爲角度還沒有「消化」這一變化,這是什麼意思的是,角不知道這個變量將在這方面改變,因此由當時的功能運行完畢后角有完成了它的消化循環,現在設置了範圍變量$scope.testSend1Response,但Angular不知道它或者不認識它。如果你改變一個JavaScript超時函數內部作用域變量

同樣的事情會發生。然而 異步角服務,如$http被包裹並且通過角被消化默認。

來解決這個問題的方法是來包裝變量在$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); 
    } 
    }); 
+0

結帳這個驚人的帖子由吉姆·霍斯金斯更多信息: http://jimhoskins.com/2012/ 17分之12/ angularjs和 - apply.html –

相關問題