在 Meteor 中访问订阅的问题
Issue with accessing subscriptions in Meteor
我正在尝试开发的 Meteor 应用程序中出现 'Exception in template helper' 错误,这让我很沮丧。
在 /lib/collections.js 中我有:
Categories = new Meteor.Collection("categories");
Venues = new Meteor.Collection("venues");
VenuesAndUsers = new Meteor.Collection("venuesAndUsers");
在 /server/main.js 中我有:
Meteor.publish("Categories", function () {
return Categories.find({}, {sort: {order: 1}});
});
Meteor.publish("Venues", function () {
return Venues.find();
});
Meteor.publish("VenuesForUser", function () {
return VenuesAndUsers.find();
});
在 /lib/router.js 中我有:
Router.configure({
// Other stuff
waitOn: function() {
return [
Meteor.subscribe('Categories'),
Meteor.subscribe('Venues'),
Meteor.subscribe('VenuesForUser'),
];
}
});
在 /client/templates/list.html 我有:
{{#each xzz}}
{{name}} - {{id}}<br />
{{/each}}
{{#each venues}}
{{venueId}} - {{userId}}<br />
{{/each}}
在 /client/templates/list.js 中我有:
venues: function() {
return VenuesForUser.find();
},
xzz: function() {
return Venues.find();
}
我的输出是:
Venue 1 - Venue 1 id
Venue 2 - Venue 2 id
...
在 javascript 控制台中,我得到:
Exception in template helper: .venues@http://localhost:3000/app/client/templates/list.js?2a82ae373ca11b4e9e171649f881c6ab1f8ed69b:11:7
bindDataContext/<@http://localhost:3000/packages/blaze.js?695c7798b7f4eebed3f8ce0cbb17c21748ff8ba8:2994:14
...
现在,我的问题是我的发布 'VenuesFoUser' 在尝试访问其内容时产生了上述错误。
但是,为什么!?
编辑:如果我将 'VenuesForUser' 的所有实例更改为 'VenuesAndUsers',则订阅有效。但这有什么意义呢?我只能为匹配 collections 的订阅命名吗?
出版物将文档发布到您的 collection。一个发布可以命名为 random
,但如果它 returns 来自一个名为 NotRandom
的 collection 的游标,那么这就是它们在客户端上发布到的 collection .
您有一个名为 VenuesForUser
的发布,其中 returns 来自 collection VenuesAndUsers
的游标。在客户端,VenuesAndUsers
是具有从服务器发布的数据的 collection。所以你只能做 VenuesAndUsers.find()
,因为没有名为 VenuesForUser
的 collection。发布名称对其他任何内容都没有影响 - 它只是一个名称。它不会为您创建新的 collection。
希望我说清楚了。
需要的,不是Meteor,而是Mongo,如:
Platypi = new Mongo.Collection('platypi');
不是:
Platypi = new Meteor.Collection('platypi');
我正在尝试开发的 Meteor 应用程序中出现 'Exception in template helper' 错误,这让我很沮丧。
在 /lib/collections.js 中我有:
Categories = new Meteor.Collection("categories");
Venues = new Meteor.Collection("venues");
VenuesAndUsers = new Meteor.Collection("venuesAndUsers");
在 /server/main.js 中我有:
Meteor.publish("Categories", function () {
return Categories.find({}, {sort: {order: 1}});
});
Meteor.publish("Venues", function () {
return Venues.find();
});
Meteor.publish("VenuesForUser", function () {
return VenuesAndUsers.find();
});
在 /lib/router.js 中我有:
Router.configure({
// Other stuff
waitOn: function() {
return [
Meteor.subscribe('Categories'),
Meteor.subscribe('Venues'),
Meteor.subscribe('VenuesForUser'),
];
}
});
在 /client/templates/list.html 我有:
{{#each xzz}}
{{name}} - {{id}}<br />
{{/each}}
{{#each venues}}
{{venueId}} - {{userId}}<br />
{{/each}}
在 /client/templates/list.js 中我有:
venues: function() {
return VenuesForUser.find();
},
xzz: function() {
return Venues.find();
}
我的输出是:
Venue 1 - Venue 1 id
Venue 2 - Venue 2 id
...
在 javascript 控制台中,我得到:
Exception in template helper: .venues@http://localhost:3000/app/client/templates/list.js?2a82ae373ca11b4e9e171649f881c6ab1f8ed69b:11:7
bindDataContext/<@http://localhost:3000/packages/blaze.js?695c7798b7f4eebed3f8ce0cbb17c21748ff8ba8:2994:14
...
现在,我的问题是我的发布 'VenuesFoUser' 在尝试访问其内容时产生了上述错误。
但是,为什么!?
编辑:如果我将 'VenuesForUser' 的所有实例更改为 'VenuesAndUsers',则订阅有效。但这有什么意义呢?我只能为匹配 collections 的订阅命名吗?
出版物将文档发布到您的 collection。一个发布可以命名为 random
,但如果它 returns 来自一个名为 NotRandom
的 collection 的游标,那么这就是它们在客户端上发布到的 collection .
您有一个名为 VenuesForUser
的发布,其中 returns 来自 collection VenuesAndUsers
的游标。在客户端,VenuesAndUsers
是具有从服务器发布的数据的 collection。所以你只能做 VenuesAndUsers.find()
,因为没有名为 VenuesForUser
的 collection。发布名称对其他任何内容都没有影响 - 它只是一个名称。它不会为您创建新的 collection。
希望我说清楚了。
需要的,不是Meteor,而是Mongo,如:
Platypi = new Mongo.Collection('platypi');
不是:
Platypi = new Meteor.Collection('platypi');