【发布时间】:2014-10-10 17:21:18
【问题描述】:
使用 Iron Router,我想根据用户所在的页面访问特定数据。 This 教程使用 Iron Router 的一个名为“数据”的功能,它根据用户所在的页面提供数据。但是还有另一种方法使用 waitOn 和订阅。
这些方法之间到底有什么区别?
【问题讨论】:
标签: routing meteor publish-subscribe iron-router
使用 Iron Router,我想根据用户所在的页面访问特定数据。 This 教程使用 Iron Router 的一个名为“数据”的功能,它根据用户所在的页面提供数据。但是还有另一种方法使用 waitOn 和订阅。
这些方法之间到底有什么区别?
【问题讨论】:
标签: routing meteor publish-subscribe iron-router
让我们分析一下你提到的教程中的简单案例:
客户端:
this.route('authors', {
waitOn: function() {
return Meteor.subscribe('authorList');
},
data: function () {
return { authors: Authors.find() };
}
});
服务器端(我自己添加的那部分):
Meteor.publish("authorList", function () {
return Authors.find();
});
假设Authors 集合有 3 个作者:
[{name:"Allan"},{name:"Brian"},{"name":"Joe"}]
为了简单起见,我假设服务器端在 authorList 发布函数中发布所有作者。
在waitOn 中,您返回订阅authorList。这给我们带来了 2 个好处:
1) 客户端订阅authorList,因此集合Authors 中的所有3 个文档都将通过DDP 发送到客户端。
2) IronRouter 可以显示loadingTemplate,直到收到所有数据。
在data 函数中你可以返回:
整套(3位作者):
Authors.find();
或子集(1 或 2 个作者):
// one author:
Authors.find({name:"Allan"});
订阅数据。
如果没有订阅,则Authors.find() 将不会填充数据。
希望对您有所帮助。 以防万一不清楚,我建议阅读:https://www.discovermeteor.com/blog/understanding-meteor-publications-and-subscriptions/
【讨论】:
mrt remove autopublish 删除包autopublish,然后不要订阅waitOn,然后尝试在data 中执行Authors.find()。您不会收到任何数据,因为它们不会通过订阅发送给客户。
'data' 设置正在渲染的模板的上下文。 Handlebars 让您可以像这样从上下文中读取属性 - {{ someProperty }}。
'subscribe' 从服务器向客户端请求新的集合数据。
【讨论】: