【问题标题】:(Angular2 Meteor) fetch from collection return empty in ngOnInit, but not for all collections(Angular2 Meteor)从集合中获取在 ngOnInit 中返回空,但不适用于所有集合
【发布时间】:2018-11-17 11:51:07
【问题描述】:

[edit:]大家好,几天后没有找到任何解决方案,也没有收到这篇文章的答案,我再次尝试编辑这篇文章,加油。

通常,我自己找到解决方案,但这次奇怪的事情让我日复一日地发疯..

事情是这样的:(使用 Meteor 和 Angular2)

我有 2 个不同的集合,documents 和 fieldList,定义方式相同:

在 /both/collections/documents.collection.ts

export const Docs = new Mongo.Collection<Doc>('documents');
export const Docss = MongoObservable.fromExisting(Docs);

在 /both/collections/fieldList.collection.ts

export const fieldLists = new Mongo.Collection<FieldList>('fieldList');
export const fieldListss = MongoObservable.fromExisting(fieldLists);

同样发布方式:

在 /server/imports/publications/documents.ts

Meteor.publish('docsList', () => {
    return Docs.find({},{});
});

在 /server/imports/publications/fieldList.ts

Meteor.publish('fieldListList', () => {
    return fieldLists.find({},{});
});

现在,在我的组件中,我订阅:

...import skipped...
export class documentPanelDocFormComponent implements OnInit,OnDestroy{
...Var declaration skipped...
...Constructor declaration skipped...
ngOnInit() {
        this.fieldListSub = MeteorObservable.subscribe('fieldListList').subscribe();
        this.docsSub = MeteorObservable.subscribe('docsList').subscribe();
...

现在,我可以在 mongool 中看到这两个集合:

Mongol result

不幸的是,当我从 db 获取时:

....still inside ngOnInit...
console.log("Documents Fetch:",Docss.find({}).fetch());
console.log("FieldLists Fetch:",fieldListss.find({}).fetch());

它有效,但仅适用于文档,我为 fieldList 得到一个空数组:

Result in chrome web console

如果有人知道这里出了什么问题,请赐教:) 在此先感谢,抱歉英语不好 PS:如果您需要代码的任何其他部分,请告诉我

【问题讨论】:

  • 大家好,发现 ngOnInit 中的 fieldList 数据尚不可用(仍然无法理解为什么它可用于 Docss..)并在 MeteorObservable 订阅中使用回调,如下所示:[...] .subscribe(docId =&gt; {this.docId = docId; this.fieldListSub = MeteorObservable.subscribe('fieldListList').subscribe( () =&gt; { this.docsSub = MeteorObservable.subscribe('docsList').subscribe( () =&gt; { console.log("FieldLists Fetch:",fieldListss.find({}).fetch());}

标签: angular meteor angular-meteor


【解决方案1】:

在订阅块解决之前,这些集合还没有准备好使用。正如您在评论中所说,如果您将 find 嵌入到 subscribe 的功能中,则订阅已准备好并且 find 将正常工作。

在订阅准备好之前对集合的任何 find 调用都将导致它不返回任何内容。

当一次获取成功而另一次失败时,您所经历的基本上是运气。第一个订阅已解决,因此第一个提取正确返回。第二次订阅还没有准备好,所以第二次获取失败。

这完全取决于 JavaScript 的异步特性。我认为您假设 .subscribe 将等到它准备好后再执行下一行代码。这样不行

【讨论】:

    猜你喜欢
    • 2015-05-07
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-09
    相关资源
    最近更新 更多