我实际上正在使用Meteor开发WebApp。因为我更专注于UI和规范,而不是为生产做好准备并考虑安全问题。(在我做完好的PoC之后,我会这样做。)
我想保留自动发布和不安全的软件包(该死的很快就可以了)。
我遇到了Iron Router的烦人问题。 问题很简单,但我找不到让它正常工作的方法。有时数据随机返回未定义。
Router.route('/stuff/:_id', {
name: 'stuff',
template: 'stuff',
data: function(){
var stuff = Stuffs.findOne(this.params._id);
console.log("stuff: ", stuff);
return {headerTitle: stuff.name, stuffData: stuff};
},
action: function(){
this.render();
}
});
实际上并不是随机的,我猜这样的事情会发生:
当我从App的链接点击此路线时工作正常(我猜数据准备好了)
但是在页面刷新或者通过url导航时,我可能会有这个恼人的未定义。
所有内容都是自动发布的,所以在我的路线中使用waitOn会很奇怪......
是否有人遇到同样的问题并获得解决方案?
答案 0 :(得分:1)
当我从App的链接点击此路线时工作正常(我猜数据准备好了)
客户端已经存在数据。在这种情况下,Iron Router仅进行客户端路由(即,没有呼叫进入服务器)。
但是在页面刷新或者通过url导航时,我可能会有这个烦人的未定义。
在这种情况下,您实际上是从服务器端请求数据..通过HTTP GET请求,您可能没有定义任何路由。
修改强>
关于HTTP GET请求我错了。似乎无论我们从浏览器加载哪个链接,Meteor服务器都会发送整个构建。将整个构建加载到客户端后,Iron Router根据URL路径决定加载哪个模板。
在页面加载/刷新时,页面在从服务器端接收数据之前呈现。这是获得undefined
的最可能原因。
在客户端数据库上附加此侦听器以检查服务器何时更新它:
if (Meteor.isClient) {
Stuffs.find().observe({
added: function(doc) {
console.log("Updated Stuffs : ", JSON.stringify(doc));
}
});
}
答案 1 :(得分:1)
搞定! 比我想象的要简单!
相关问题: https://github.com/iron-meteor/iron-router/issues/295
显然Meteor游标是被动的,最后我只需做:
Router.route('/stuff/:_id', {
name: 'stuff',
template: 'stuff',
data: function(){
var stuff = Stuffs.findOne(this.params._id);
if(stuff){
console.log("stuff: ", stuff);
return {headerTitle: stuff.name, stuffData: stuff};
}
},
action: function(){
this.render();
}
});
在做任何事情之前测试是否未定义东西,因此不使用东西 - >没有错误。在更新时,钩子将重新运行,完成。
那就是它。很酷很简单,我甚至都没想过!