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