Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有Angular2的Meteor,在一次拍摄中从集合中获取所有条目_Meteor_Angular Meteor - Fatal编程技术网

带有Angular2的Meteor,在一次拍摄中从集合中获取所有条目

带有Angular2的Meteor,在一次拍摄中从集合中获取所有条目,meteor,angular-meteor,Meteor,Angular Meteor,我已成功地将meteor与angular2集成,但在从收集中获取数据时,遇到了一次性获取数据的困难,以下是步骤: 集合名称:订单详细信息 记录数:1000 服务器: 已创建用于订阅集合的发布文件: Meteor.publish('orderFilter', function() { return OrderLineDetails.find({}); }); 客户端: this.dateSubscription = MeteorObservable.subsc

我已成功地将meteor与angular2集成,但在从收集中获取数据时,遇到了一次性获取数据的困难,以下是步骤:

集合名称:订单详细信息 记录数: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次,就像colleciton中的1000个条目一样


有没有办法在一次拍摄中获得整个收藏条目,并平均订阅收藏更改的时间?

我认为这是不可能的。当您订阅一个可观察对象时,它将值作为“流”处理,而不一定是一个循环。我见过一些临时的助手方法,它们同步处理数据,尽管订阅所需的时间没有减少。看看这篇文章的引擎盖下看看

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

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

  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
    );
  }
值:YourModel[]=[]//这是一组用于存储数据的模型
数据:可见;
错误:字符串[];
子完成:布尔值=false;
构造函数(){
this.theData=OrderDetails.find({expectedShipDate:{$in:strArr}},{字段:{“expectedShipDate”:1,“loadNo”:1},排序:{“expectedShipDate”:1});
MeteorObservable.subscribe('orderFilter').subscribe();
//将数据推送到值数组中
这个是。theData.subscribe(
value=>this.values=value,
error=>this.errors.push(“新错误”),
()=>this.subFinished=true
);
}

“values”数组会随着数据库发生的任何更改而更新。

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

如果同时拥有所有东西很重要,则使用以下方法:

MeteorObservable.call('getAllElements', (err, result) => {
  // result.length === all elements
})
在服务器端执行

Meteor.methods({
   getAllElements:function(){return myCollection.find().fetch()}
})
现在,如果您想要监听更改,当然您必须进行订阅,如果您想要降低订阅量,请使用rxjs的debounceTime()函数,例如(从代码中):

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

现在,基于你的意图:倾听变化,同时获得一切,你可以将这两种方法结合起来,虽然不是最有效的,但可能是有效的

正如@Rager所解释的,可观测数据接近于流,因此当您在miniMongo(查找()数据时使用的前端集合,订阅发布时填充)上填充数据时,它将开始递增,直到集合同步

由于miniMongo是在订阅发布时填充的,而不是在查询光标时填充的,因此您可以:

  • 尝试debouceTime()方法
  • 订阅出版物后使用Meteor.Method,然后同步两个结果,将该方法的第一个响应作为起点,然后使用Collection.find()中的数据。订阅(collectionArray=>,err=>)以在应用更改时执行您想执行的操作(不建议这样做,除非您对此有特定的用例)

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

    谢谢Gabriel,我可以一次性获取收藏信息,也可以使用debounce获取订阅信息。
    this.theData.debounceTime(400).subscribe(value => ...., err =>)