我正在将PouchDB数据库中的allDocs()读入AngularJS变量:
var db = pouchService.db;
$scope.recordlist = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true});
console.log($scope.recordlist);
我注意到它返回了一个promise,当我尝试使用ng-repeat读取数组(以及数组中对象的属性)时,它实际上无法访问结果,我猜是因为它们是深深嵌套。
<div class="row msf-row"
ng-repeat="record in recordlist | filter: shouldShow"
ng-class="{ 'msf-cancelled': record.cancelled, 'msf-commented' : record.comment}">
<div class="col-md-1">{{record.time}}</div>
</div>
有没有办法将这个承诺变成一个简单的对象数组?
我也在应用程序中加载了LoDash,我不知道它是否可以使用。
答案 0 :(得分:3)
在履行承诺后分配数组(如果发生错误则显示错误):
$q.when(db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true}))
.then(function (recordlist) {
$scope.recordList = recordList;
console.log($scope.recordlist);
})
.catch(function (error) {
console.error(error);
});
<强>更新强>
正如Matt在评论中指出的那样,如果您不使用angular-pouch angular-pouchdb包装器,那么您需要将操作包装在$scope.$apply()
中以触发摘要周期或首先转换承诺与$q.when()
的角度承诺。我认为将promise转换为有角度的promise也会处理日志记录错误,但是你应该总是处理错误(向用户显示一条消息)。当然,您可以使用全局错误处理程序来完成此操作。
答案 1 :(得分:1)
您正在做的是访问承诺,而不是承诺结果。虽然allDocs
确实返回了一个承诺,但它不是一个有角度的承诺,所以你也应该将承诺包裹在when
中以获得实际的角度承诺。
var pouchPromise = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true});
$q.when(pouchPromise).then(function(recordList){
$scope.recordList = recordList;
console.log($scope.recordlist);
});
我会读到承诺的工作方式here。
应该注意的是,这种利用小袋的方法在这里的实际pouchDB文档中有概述:http://pouchdb.com/api.html
具体做法是:
使用Ionic / Angular?您可以在$ q.when()中包装PouchDB承诺。这将通知Angular在PouchDB承诺解决后更新UI。
这将允许您在处理非角度承诺的异步性质时避免使用$scope.$apply()
。