角度变量不会被设置为#34;函数调用之间

时间:2015-05-12 17:46:04

标签: javascript angularjs twitter-bootstrap

我有一个角度设置,它将设置一个变量的值,但不会放过它。我试图在对http的两个函数调用之间设置/重置$ scope变量的值。所以基本上:

$scope.submit = function() {
        $http({
          url:'http://localhost:3001/foo/api/v1/auth',
          method: 'post',
          data: JSON.stringify({email:$scope.user.email}),
          headers: {'Content-type': 'application/json'}
        }).success(function (data, status, headers, config) {
          $scope.status = data.status;
        }).error(function(data, status, headers, config) {
          $scope.status = status + ' ' + headers;
        }) ...etc...

然后当第一个完成时,html页面会相应地更改,然后我调用另一个函数:

  $scope.thirdPage = function(user) {
    var userStatus;
    var goCode = JSON.stringify({email:$scope.user.email, securitycode:$scope.userCode});
    $http({
      url:'http://localhost:3001/foo/api/v1/auth',
      method: 'post',
      data: goCode,
      headers: {'Content-type': 'application/json'}
    }).success(function (data, status, headers, config) {      
      //neither of these work
       $scope.status = data.status; //retains original value
       $scope.userStatus = data.status; //will not pick up data.status
    }).error(function(data, status, headers, config) {
      $scope.status = status + ' ' + headers;
      $log.warn("scopeErrorStatus: " + $scope.status);
    })

Angular不允许我将$scope.status的值从一个函数重新设置为下一个函数,并且不允许我将另一个变量设置为data.status。认为问题是AJAX查询还没有完成我尝试使用$ watch(没有区别)和$ apply(抛出一个似乎与运行的Bootstrap代码有某种关系的错误)。已经将变量声明为函数的局部变量,全局等等。把我的头发拉出来。思考?

2 个答案:

答案 0 :(得分:1)

这可能是由于原语在Angular中使用子范围的方式。我怀疑你已经在某处创建了一个子范围,并且你要更新的值已经被遮蔽了。

解决此问题的方法是将范围属性移动到对象。如:

$scope.model = {};
$scope.model.status = "ok";

有关此内容的更多信息:http://nathanleclaire.com/blog/2014/04/19/5-angularjs-antipatterns-and-pitfalls/

答案 1 :(得分:1)

调试的第一步应该是输出$scope.statusdata.status的值。要查看该值是否确实未分配。

因此,您应该将相关行之前和之后的两个值记录到控制台,以查看最新情况。

console.log(data.status + "/" + $scope.status);

我无法想象作业失败了。因此,记录值以查看实际发生的情况。