Angular ui-router解析promise提供无限的摘要循环

时间:2015-02-02 19:18:44

标签: javascript angularjs cordova angular-ui-router cordova-plugins

我在尝试在定义状态时使用resolve加载视图之前从我的SQLite DB加载数据。

目前:ui-router state

.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&amp; p1 =%5B%5D

2 个答案:

答案 0 :(得分:0)

您应该从您的服务中退回承诺&amp;然后你可以在控制器内访问它。在UI-Router DOCS

中解决承诺
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
  });

});

这对你有帮助。感谢。

答案 1 :(得分:0)

如果您的应用程序中发生任何错误,可能会发生这种情况(在我的情况下,我对angularfire有依赖。但我忘了将firebase.js包含在我的应用程序中)。 由于您使用的是resolve,因此您将看不到实际的错误,并且您将获得此无限摘要错误。

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