【问题标题】:Meteor with Angular2 , Fetching all entries from a collection in single shot使用 Angular2 的流星,一次从集合中获取所有条目
【发布时间】:2018-09-29 23:44:35
【问题描述】:

我已经用 angular2 成功地对流星进行了整数处理,但是在从集合中获取数据时,遇到了一次拍摄的困难,以下是步骤:

集合名称:OrderDetails 记录数: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 个条目。

有没有什么方法可以一次性获取整个集合条目,同时订阅集合中的更改?

【问题讨论】:

    标签: meteor angular-meteor


    【解决方案1】:

    我认为这是不可能的。当您订阅 Observable 时,它​​会将值作为“流”处理,而不一定是循环。我已经看到一些临时的帮助方法可以同步处理数据,尽管订阅的时间并没有减少。查看这篇文章以了解幕后情况...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
        );
      }
    

    “值”数组会随着数据库发生的任何变化而更新。

    【讨论】:

      【解决方案2】:

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

      如果一次拥有所有东西很重要,请使用以下方法:

      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=>) 在应用更改时执行您想做的任何事情(不建议这样做,除非您有特定的用例)

      此外,.zone() 函数专门用于在 Angular 的事件周期中强制重新渲染。如果您正在处理集合的数据而不是在 ngFor* 循环上呈现它,我建议不要使用它。如果您使用的是 ngFor* 循环,请改用异步管道 ngFor="let entry of Collection | async"

      【讨论】:

      • 感谢 Gabriel,我能够单次获取收藏信息以及去抖订阅。
      猜你喜欢
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      相关资源
      最近更新 更多