Javascript 在promise函数从数据库填充数据之前触发Ionic/Angular$watch的问题

Javascript 在promise函数从数据库填充数据之前触发Ionic/Angular$watch的问题,javascript,angularjs,ionic-framework,promise,pouchdb,Javascript,Angularjs,Ionic Framework,Promise,Pouchdb,我真的不知道从哪里开始描述这个问题。 在互联网上查找一些信息非常困难 我有一个Ionic应用程序(使用AngularJS),它将数据保存到本地数据库 在主页中,我有一个嵌套视图,在左列(第一个控制器)包含以前保存的数据列表,在中间列(第二个控制器)包含用户从左侧选择的项目的详细信息 这就是问题所在:当用户单击左列中的一个项目时,页面中央将启动一个新的控制器,该控制器应显示详细信息,但显示空输入。 再次单击同一项,将填充所有输入 我在加载的变量中添加了$watch,记录了值,并且在回调函数中也这样

我真的不知道从哪里开始描述这个问题。 在互联网上查找一些信息非常困难

我有一个Ionic应用程序(使用AngularJS),它将数据保存到本地数据库

在主页中,我有一个嵌套视图,在左列(第一个控制器)包含以前保存的数据列表,在中间列(第二个控制器)包含用户从左侧选择的项目的详细信息

这就是问题所在:当用户单击左列中的一个项目时,页面中央将启动一个新的控制器,该控制器应显示详细信息,但显示空输入。 再次单击同一项,将填充所有输入

我在加载的变量中添加了$watch,记录了值,并且在回调函数中也这样做了。 当用户第一次单击时,结果如下:

($watch) myvar has changed from undefined to undefined
(setValues) myvar.name: test
这是我下次单击时发生的情况:

($watch) myvar has changed from undefined to _id: 8ee32942-1c61-865b-2cd0-8d5b3d4a3082; name: test
同样的问题也发生在加载左侧的项目时

我从本地数据库加载数据。我没有实际查询数据库,而是尝试用

return Promise.resolve({'_id': 'test001', 'name': 'test'});
你猜怎么着,它能用

所以现在的问题是:问题在哪里?是控制器吗?这是什么?是离子骨架吗?是加载功能吗

最后是一些代码:

$scope.$watch('myvar', function( newValue, oldValue ) {
  console.log('($watch) myvar has changed from ' + printMyvar(oldValue) + ' to ' + printMyvar(newValue));
});

var printMyvar = function (var_to_print) {
  var s = 'undefined';
  if (var_to_print) {
    s = '_id: ' + var_to_print._id;
    s += '; name: ' + var_to_print.name;
  }
  return s;
}

var setValues = function (doc) {
  console.log('(setValues) name: ' + doc._id);
  $scope.myvar = doc;
};

$scope.isNew = ($stateParams.extId === 'new');

if ($scope.isNew) {
  $scope.myvar = { '_id': '', 'name': '' };
}  
else {
  Database.get( $stateParams.extId )
    .then( setValues )
    .catch( $scope.logError );
}

请阅读“为什么”一节

PockDB是异步的,您通常需要调用$scope.$apply()才能将更改反映到UI上

angular.controller('MyCtrl', function($scope, $window) {
  var db = $window.PouchDB('db');
  db.get('id')
    .then(function(res) {
      // Binding may/may not be updated depending on whether a digest cycle has
      // been triggered elsewhere as Angular is unaware that `get` has resolved.
      $scope.one = res;
    });

  var db2 = $window.PouchDB('db2');
  db.get('id')
    .then(function(res) {
      $scope.$apply(function() {
        // Value has been bound within Angular's context, so a digest will be
        // triggered and the DOM updated
        $scope.two = res;
      });
    });
});

谢谢你,毛罗!你救了我的命!添加$scope.$apply使整个过程正常运行。