如何在回调函数中获取AngularJS中$ scope变量的当前状态?

时间:2015-01-28 01:57:11

标签: javascript angularjs rest angularjs-scope angularjs-service

我在使用服务/工厂进行REST接口并在create方法的回调函数中访问$ scope变量的当前数据时遇到问题:

controllers.controller('ResourceAddCtrl', ['$scope', ... 'Resource','ResourceComb',
        function($scope, ...) {
            ...
            $scope.selectedEntryId = {};
            $scope.resource = new Resource();
            $scope.addResource = function(){
                $scope.resource.$create(function(response){
                    var id = response.id;
                    console.log($scope.selectedEntryId);
                    //ResourceComb.$create({res_id : id, rescomb_id : $scope.selectedEntryId},function(){});

                }); 
            };
        }]);

问题是$scope.selectedEntryId始终是回调方法中的初始值,尽管它在html代码中使用了whith ng-model并且值得到了完全更新,因为{{selectedEntryId}}产生了预期的输出在bindet输入字段中键入数字。 任何人都知道我的错误是什么或如何-i可以解决问题?

3 个答案:

答案 0 :(得分:0)

这可能太明显无法解决您的问题,但在我看来,一旦返回,您需要设置范围内的值。

// fwiw I'd prob. make the default a string
$scope.selectedEntryId = '';
$scope.resource = new Resource();
$scope.addResource = function(){
  $scope.resource.$create(function(response){
    // Set the ID on the scope
    $scope.selectedEntryId = response.id;
    // This is trivial now, but it will be the correct value
    console.log($scope.selectedEntryId);
    // ...and the HTML should automatically update itself, as well.
  }); 
};

答案 1 :(得分:0)

我假设Resource是ngResource,在这种情况下,您传递给$create的函数回调。

来自文档:

  
      
  • HTTP GET“类”操作:Resource.action([parameters], [success], [error])
  •   
  • 非GET“类”操作:Resource.action([parameters], postData, [success], [error])
  •   
  • 非GET实例操作:instance.$action([parameters], [success], [error])
  •   
     

AngularJS $resource Docs

因此,在您的代码中,您实际上是在传递[parameters],而不是[success] - 因此当函数运行时调用尚未进行,因此selectedEntryId是其初始值。< / p>

鉴于此,请尝试以下方法:

$scope.addResource = function(){
     $scope.resource.$create(null, function(response){
        var id = response.id;
        console.log($scope.selectedEntryId);
        //ResourceComb.$create({res_id : id, rescomb_id : $scope.selectedEntryId},function(){});

     }); 
};

答案 2 :(得分:0)

好的,真正的问题是不同的。我尝试了一个新的简单示例(Plunker )并发现原因必须是ngInclude。我没想到这会产生影响:看看这个例子: 在主控制器中进行更改时,模型始终在一个方向上更新,但在包含页面中另一方面更改控制器变量x不会更新。