我已经成功地使用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个条目。
有没有办法在一次拍摄中获得整个集合条目,并且有时间订阅集合中的更改?
答案 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,而不是在查询游标时填充,您可以:
此外,.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;使用数据库发生的任何更改来更新数组。