Meteor Iron 路由器 WaitOn 订阅
Meteor Iron Router WaitOn Subscription
在将 data
返回到模板之前,我真的很难等待订阅加载特定路由。我可以从服务器上的发布上看到找到了文档,但是在客户端上没有文档。
如果我在发布时执行 find().count(),它显示找到 1 个文档,这是正确的,但是当我在订阅上执行计数时,它显示 0 个文档。
我尝试了很多不同的方法,比如使用 subscriptions:function() 而不是 waitOn:function(),但没有任何效果。
Collections.js 库:
SinglePackage = new Mongo.Collection("SinglePackage");
SinglePackage.allow({
insert: function(){
return true;
},
update: function(){
return true;
},
remove: function(){
return true;
}
});
Publications.js 服务器:
Meteor.publish("SinglePackage", function(pack_id) {
return Packages.find({shortId: pack_id});
});
铁路由器:
Router.route('/package/:id', {
name: 'package.show',
template: 'Package_page',
layoutTemplate: 'Landing_layout',
waitOn: function() {
return Meteor.subscribe('SinglePackage', this.params.id);
},
data: function() {
return SinglePackage.find();
},
action: function () {
if (this.ready()) {
this.render();
} else {
this.render('Loading');
}
}
});
我是不是做错了什么,或者这只是一件很难实现的事情?有人会认为 waitOn 会使函数的其余部分等待订阅准备就绪。
非常感谢任何帮助。
看来 data
函数在订阅准备就绪之前 运行ning。即使 data
函数在订阅准备就绪后执行了 运行,它也不会是一个反应性数据源,使 pub/sub 在这里毫无意义。 Here's a great article on reactive data sources.
参考 Iron Router Docs 中的订阅示例,您可以这样做:
Router.route('/package/:id', {
subscriptions: function() {
// returning a subscription handle or an array of subscription handles
// adds them to the wait list.
return Meteor.subscribe('SinglePackage', this.params.id);
},
action: function () {
if (this.ready()) {
this.render();
} else {
this.render('Loading');
}
}
});
然后在你的 template.js:
Template.Package_page.helpers({
singlePackage() {
// This is now a reactive data source and will automatically update whenever SinglePackage changes in Mongo.
return Package.find().fetch();
}
});
在您的 template.html 中,您现在可以使用 singlePackage
:
<template name="Package_page">
{#with singlePackage} <!-- Use #each if you're singlePackage is an array -->
ID: {_id}
{/with}
</template>
在将 data
返回到模板之前,我真的很难等待订阅加载特定路由。我可以从服务器上的发布上看到找到了文档,但是在客户端上没有文档。
如果我在发布时执行 find().count(),它显示找到 1 个文档,这是正确的,但是当我在订阅上执行计数时,它显示 0 个文档。
我尝试了很多不同的方法,比如使用 subscriptions:function() 而不是 waitOn:function(),但没有任何效果。
Collections.js 库:
SinglePackage = new Mongo.Collection("SinglePackage");
SinglePackage.allow({
insert: function(){
return true;
},
update: function(){
return true;
},
remove: function(){
return true;
}
});
Publications.js 服务器:
Meteor.publish("SinglePackage", function(pack_id) {
return Packages.find({shortId: pack_id});
});
铁路由器:
Router.route('/package/:id', {
name: 'package.show',
template: 'Package_page',
layoutTemplate: 'Landing_layout',
waitOn: function() {
return Meteor.subscribe('SinglePackage', this.params.id);
},
data: function() {
return SinglePackage.find();
},
action: function () {
if (this.ready()) {
this.render();
} else {
this.render('Loading');
}
}
});
我是不是做错了什么,或者这只是一件很难实现的事情?有人会认为 waitOn 会使函数的其余部分等待订阅准备就绪。
非常感谢任何帮助。
看来 data
函数在订阅准备就绪之前 运行ning。即使 data
函数在订阅准备就绪后执行了 运行,它也不会是一个反应性数据源,使 pub/sub 在这里毫无意义。 Here's a great article on reactive data sources.
参考 Iron Router Docs 中的订阅示例,您可以这样做:
Router.route('/package/:id', {
subscriptions: function() {
// returning a subscription handle or an array of subscription handles
// adds them to the wait list.
return Meteor.subscribe('SinglePackage', this.params.id);
},
action: function () {
if (this.ready()) {
this.render();
} else {
this.render('Loading');
}
}
});
然后在你的 template.js:
Template.Package_page.helpers({
singlePackage() {
// This is now a reactive data source and will automatically update whenever SinglePackage changes in Mongo.
return Package.find().fetch();
}
});
在您的 template.html 中,您现在可以使用 singlePackage
:
<template name="Package_page">
{#with singlePackage} <!-- Use #each if you're singlePackage is an array -->
ID: {_id}
{/with}
</template>