带有Angular2的Meteor,从单个集合中获取集合中的所有条目

时间:2018-04-19 12:51:57

标签: meteor angular-meteor

我已经成功地使用angular2对meteor进行了网格化,但是在收集数据时遇到了一次性的困难,以下是步骤:

集合名称:OrderDetails No Of records :1000

服务器    创建发布文件以描述集合:

Meteor.publish('orderFilter', function() {
         return OrderLineDetails.find({});
   });

客户端:

this.dateSubscription = 
     MeteorObservable.subscribe('orderFilter').subscribe(()=> {
        let lines = OrderDetails.find({expectedShipDate:{$in:strArr}},{fields: 
    {"expectedShipDate":1,"loadNo":1},sort:{"expectedShipDate":1}}).fetch();
   });

在此行属性中提取所有集合条目,但无法订阅更改

当我尝试下面的一个时,

OrderDetails.find({expectedShipDate:{$in:strArr}},{fields:{"expectedShipDate":1,"loadNo":1},sort:{"expectedShipDate":1}}).zone().subscribe(results => {
     // code to loop the results
});

在此能够订阅集合更改,但结果循环1000次,作为集合中的1000个条目。

有没有办法在一次拍摄中获得整个集合条目,并且有时间订阅集合中的更改?

2 个答案:

答案 0 :(得分:1)

是的,有几种方法可以做到这一点,主要取决于您希望如何处理数据。

如果一次拥有一切很重要,那么请使用如下方法:

MeteorObservable.call('getAllElements', (err, result) => {
  // result.length === all elements
})

在服务器端执行

Meteor.methods({
   getAllElements:function(){return myCollection.find().fetch()}
})

现在,如果您想收听更改,当然您必须进行订阅,如果您想降低订阅量,请使用rxjs的debounceTime()函数,例如(来自您的代码):

this.theData.debounceTime(400).subscribe(value => ...., err =>)

这将在订阅该集合之前等待一段时间。

现在,根据您的意图:聆听变化并立即获取所有内容,您可以将这两种方法结合起来,而不是最有效但可以有效。

正如@Rager解释的那样,observables靠近流,所以当你在miniMongo上填充数据时(你在find()数据时使用的前端集合,并在订阅发布时填充)它将开始递增,直到收集到同步。

由于在订阅发布时填充了miniMongo,而不是在查询游标时填充,您可以:

  1. 尝试使用debouceTime()方法
  2. 订阅发布后使用Meteor.Method,然后同步两个结果,保持方法的第一个响应作为起点,然后使用 Collection.find中的数据( ).subscribe(collectionArray => ...,err =>)执行更改时要执行的操作(不是建议的,除非您有特定的用例)
  3. 此外,.zone()函数特定于强制重新渲染Angular的事件周期。如果您正在处理集合的数据而不是在ngFor *循环上呈现它,我建议不要使用它。如果您使用的是ngFor *循环,请使用异步管道ngFor="let entry of Collection | async"

答案 1 :(得分:0)

我不认为这是可能的。当您订阅Observable时,它将值作为" stream"处理,不一定是循环。我已经看到了一些同步处理数据的临时辅助方法,尽管订阅所需的时间并没有减少。查看这篇文章,了解一下...... A simple Observable implementation

但是,您可以将其设置为仅循环一次。

我一直在设置该场景的方式,集合只会循环一次(在应用程序启动时在构造函数中)并检测集合中的更改。在你的情况下,它看起来像:

  values: YourModel[] = []; //this is an array of models to store the data
  theData: Observable<YourModel[]>;
  errors: string[];
  subFinished: boolean = false;

  constructor(){
    this.theData = OrderDetails.find({expectedShipDate:{$in:strArr}},{fields:{"expectedShipDate":1,"loadNo":1},sort:{"expectedShipDate":1}}).zone();
    MeteorObservable.subscribe('orderFilter').subscribe();

    //push data onto the values array
    this.theData.subscribe(
      value => this.values = value,
      error => this.errors.push("new error"),
      () => this.subFinished = true
    );
  }

&#34;价值观&#34;使用数据库发生的任何更改来更新数组。