我是流星的新手,并一直试图通过探索流星书来学习框架。我有一些问题,了解我的应用程序究竟发生了什么(在https://github.com/Themitchell/Sound-wav.es找到)。
基本上,我的理解是,在我的服务器端,我允许某些集合的发布,这些集合从我的客户端订阅调用中获取参数。对于我服务器上的这部分,我在我的server / publications.js文件中有这个:
Meteor.publish('studios', function (options) {
return Studios.find({
userId: this.userId
}, options);
});
Meteor.publish('studio', function (id) {
return id && Studios.find({
userId: this.userId,
_id: id
});
});
接下来,我们需要一个控制器来处理路由并处理等待所需的任何订阅,然后,一旦订阅准备好(因此waitOn),就将渲染模板提供数据功能作为反应数据源。模板。
然后我设置了我的2条索引工作室的路线,并展示了一个使用铁路由器和“控制器”的工作室。如下:
StudiosIndexController = RouteController.extend({
template: 'studiosIndex',
increment: 20,
limit: function () {
return parseInt(this.params.studiosLimit) || this.increment;
},
findOptions: function () {
return {
sort: this.sort,
limit: this.limit()
};
},
waitOn: function () {
return Meteor.subscribe('studios', this.findOptions());
},
studios: function () {
return Studios.find({}, this.findOptions());
},
data: function () {
return {
studios: this.studios()
};
}
});
ShowStudioController = RouteController.extend({
template: 'showStudio',
waitOn: function () {
return Meteor.subscribe('studio', this.params._id);
},
studio: function () {
return Studios.findOne(this.params._id);
},
data: function () {
return {
studio: this.studio()
};
}
});
Router.map(function () {
this.route('studiosIndex', {
path: '/',
controller: StudiosIndexController
});
this.route('showStudio', {
path: '/studios/:_id',
controller: ShowStudioController
});
});
现在这很棒,在显示我的索引页面时工作正常。我得到了一个反应性的集合列表,当我向集合中引入新的工作室时,我看到它们分别在服务器和客户端上创建。但是在我的show视图中,当渲染视图时,数据似乎总是为空。在使用调试器进入我的show controller的数据功能时,我尝试查询工作室,即使我尝试获取所有可能的内容,也始终返回undefined。奇怪的是,我知道我的出版物正在记录工作室的正确ID(使用console.log)。似乎我得到了所有正确的数据,直到客户端的路由。参数id都是正确的,但是对studio的find()调用总是不返回任何内容。我错过了一些明显的东西。
值得注意的是,我删除了我的工作室'工作室'和' studio'在views / studios / index.js和views / studios / show.js中,我的理解是这就是我在控制器中对工作室和工作室做的事情。这些助手现在在控制器级别定义并传递给反应性数据'功能。这是对的吗?
TL; DR
使用上面的代码,我的索引操作可行但是我的show动作失败,数据函数总是返回undefined,实际上在show页面上我无法访问我的任何工作室信息(Studios.find({})。 ()总是返回0)。我不确定这两条路线是如何不同的。有谁能发现这个问题?
编辑:还有值得注意的是,我已经尝试过使用this.ready()了解了github上的一些铁路由器问题。第一次运行路由时,我点击数据,这是假的,但是甚至包裹我的数据助手等待this.ready()得到一个未定义的返回值,当this.ready()返回true时。
额外备注 我运行流星0.8.0与铁路由器的最新0.7.0版本和简单架构的集合2,以防你感兴趣/需要此信息。
编辑:可能的解决方案 所以摆弄它似乎是我的助手是问题。通过使用' studio'部分然后在我的数据函数中调用this.studio()这似乎打破了。如果我更改以下代码:
ShowStudioController = RouteController.extend({
template: 'showStudio',
waitOn: function () {
return Meteor.subscribe('studio', this.params._id);
},
studio: function () {
return Studios.findOne(this.params._id);
},
data: function () {
return {
studio: this.studio()
};
}
});
到这个
ShowStudioController = RouteController.extend({
template: 'showStudio',
waitOn: function () {
return Meteor.subscribe('studio', this.params._id);
},
data: function () {
return Studios.findOne(this.params._id);
}
});
我的视图再次正确呈现。我不确定我在哪里看到这种模式,但我已经假定了分配给工作室'基本上和做
一样Template.showStudio.helpers({
studio: function () {
return Studios.findOne(this.params._id)
}
});
但似乎没有!