当显示文档列表时,如果模板在其他地方重用,则可以更清楚地在文档级别(列表级别)编写订阅。效率低下还是Meteor神奇地处理事情?
更确切地说,我可以将文档逻辑放在文档模板中:
Template.itemsList.helpers({
items: function() {
return this.itemsIds.map(function(id) { return { _id: id }; });
},
});
<template name="itemsList">
{{#each items}}{{> item}}{{/each}}
</template>
Template.item.onCreated(function() {
this.subscribe('item', this.data._id);
});
<template name="item">
{{#if Template.subscriptionsReady}}
...
{{/if}}
</template>
或仅在列表级别订阅一次这些文档:
Template.itemsList.onCreated(function() {
this.subscribe('items', this.data.itemsIds);
});
Template.itemsList.helpers({
items: function() {
return Items.find({_id: {$in: this.itemsIds}});
},
});
<template name="itemsList">
{{#if Template.subscriptionsReady}}
{{#each items}}{{> item}}{{/each}}
{{/if}}
</template>
<template name="item">
...
</template>
看起来第二种方法效率更高,因为订阅只有一次调用。如果我们在这里谈论标准的http请求,毫无疑问。但是,由于Meteor是基于套接字的,并且很好地处理了许多事情,我想知道将一些逻辑从文档移到列表中是值得的。
答案 0 :(得分:1)
通常最好拨打一次订阅。当您使用new params运行subscribe时,重新运行publish方法,然后调用db来获取所需的文档并将其发送到客户端。通常只对db进行一次调用会更好,更有效。
但是,如果您确定要显示所有项目以及Items
集合中的项目不是太多,这是有道理的。
如果有大量项目(数百或更多),最好做一些分页以避免将所有文档下载到客户端。