AngularJS 1.2.26 $ scope异步函数执行摘要周期错误

时间:2015-06-08 09:18:51

标签: javascript angularjs asynchronous

我需要在范围内有一个函数,结果将异步更改。

必须要有一个函数用作表达式,所以我不能使用单个属性。

在我的示例中,该函数返回一个对象的属性,该属性将被异步修改。这会执行摘要错误,尽管该值在整个摘要周期内相等。 这里的例子如下: http://plnkr.co/edit/YmyroMiMyMzUaLW4tc7V(警告:它可能会挂起您的浏览器)

myApp.controller('Ctrl1', ['$scope', '$http',  function($scope, $http) {
    var myObj = {found:false};
    $scope.util = {};

    $scope.util.asyncFunc = function(){

      $http.get('http://localhost').then(changeValue,changeValue);

      return myObj.found;
    }

    function changeValue(){
      myObj.found = true;
    }
}]);

知道怎么解决吗?

1 个答案:

答案 0 :(得分:0)

我有一个解决方案,问题是一直执行$ http.get,它会创建将同时解决的promises。所以,首先我通过检查是否已经创建了promise来解决问题。之后在promise的回调中,我设置了我的var,它控制是否创建了null,但是我重新定义了函数做一种返回相同值的桥,以避免在同一个$ digest中执行$ http.get: http://plnkr.co/edit/LOXDzVC4do2GTRtyNgSU

var myApp = angular.module('myApp', []);
//nueva 2015-06-09
myApp.controller('Ctrl1', ['$scope', '$http', '$q', function($scope, $http, $q) {
    var myObj = {found:false};
    $scope.util = {};
     var pro;
    $scope.util.asyncFunc = doGet;



    function doGet(param1, param2){
      if(!pro){
        pro = $http.get('http://localhost').then(changeValue,changeValue);
      }

      return myObj.found;

      function changeValue(){
        if(param1 !== "2"){
          myObj.found = true;
        }else{
          myObj.found = false;
        }


        $scope.util.asyncFunc = function(param1, param2){
          $scope.util.asyncFunc = doGet;
          pro = null;

          return myObj.found;
        }
    }
    }
}]);

和html:

<body>
    <div ng-controller="Ctrl1">
          <br/><br/>
          Param1:<input type="text" ng-model="model.param1" />
          Param2:<input type="text" ng-model="model.param2" />

        AsyncFunc: {{util.asyncFunc(model.param1, model.param2)}}
    </div>

    <script src="http://code.angularjs.org/1.2.26/angular.js"></script>
    <script src="script.js"></script>
  </body>

嗯,我认为这肯定不是最好的解决方案,如果你有其他方法,那将非常有帮助。