承诺使用PouchDB和AngularJs ng-repeat进行数组

时间:2015-09-24 20:18:31

标签: javascript arrays angularjs lodash pouchdb

我正在将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>

有没有办法将这个承诺变成一个简单的对象数组?

enter image description here

我也在应用程序中加载了LoDash,我不知道它是否可以使用。

2 个答案:

答案 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()