Angular ui-router resolve promise给出了无限的摘要循环

Angular ui-router resolve promise gives infinite digest loop

本文关键字:无限 循环 ui-router resolve promise Angular      更新时间:2023-09-26

我正在尝试在加载视图之前从我的SQLite数据库加载数据,在定义状态时使用solve。

当前:ui 路由器状态

.state("menu", {
    templateUrl: "templates/menu.html",
    controller: "MenuCtrl",
    url: "/menu",
    resolve:{
         simpleObj:  function(){
            return {value: 'simple!'};
         },
         promiseObj:  function($cordovaSQLite){
            query = "SELECT id FROM reports WHERE progress_status<2";
            $cordovaSQLite.execute(db, query, []).then(function(res) {                  
              var pendingList = [];
              for (var i = 0; i < res.rows.length; i++) {
                 pendingList.push(res.rows.item(i).id);
              }
              return pendingList;
            });
         }
      }
})

控制器

angular.module('starter.controllers').controller('MenuCtrl', function($scope, promiseObj) {
  console.log(JSON.stringify(promiseObj));
});

但是这段代码给了我一个无限的摘要循环。

我通常让数据库在服务中执行代码(给出相同的结果),但为了测试而内联移动

谁能告诉我如何正确地做到这一点?

更新:

错误消息如下:

02-04 12:07:03.520:D/CordovaLog(7773): file:///android_asset/www/lib/ionic/js/ionic.bundle.js:第 19387 行:错误:[$rootScope:infdig] 达到 10 次$digest() 次迭代。中止!

02-04 12:07:03.520:D/CordovaLog(7773):最近 5 次迭代中触发的观察者:[]

02-04 12:07:03.520: D/CordovaLog(7773): http://errors.angularjs.org/1.3.6/$rootScope/infdig?p0=10&p1=%5B%5D

如果您的应用程序中发生任何错误,则可能会发生这种情况(就我而言,我依赖于 angularfire。但是我忘了将火力基地.js包含在我的应用程序中)。由于您使用的是解析,因此您不会看到实际错误,并且会收到此无限摘要错误。

根据我的经验,我猜测您的应用程序中存在一些错误,导致无法执行解析。

你应该从你的服务返回一个承诺,然后你可以在控制器中访问它。解决 UI 路由器文档中的承诺

promiseObj: function($cordovaSQLite, $q) {
        var deferred = $q.defer();
        query = "SELECT id FROM reports WHERE progress_status<2";
        $cordovaSQLite.execute(db, query, []).then(function(res) {                  
          var pendingList = [];
          for (var i = 0; i < res.rows.length; i++) {
             pendingList.push(res.rows.item(i).id);
          }
          deferred.resolve(pendingList);
        });
        return deferred.promise;
    }

控制器

angular.module('starter.controllers').controller('MenuCtrl', function($scope, promiseObj) {
  //here the promise get available
  $scope.promiseObj = promiseObj;
  $scope.promiseObj.then(function(data){
     $scope.pendingList = data; //get pending here
  });
});

这可能对您有所帮助。谢谢。