如何等待订阅 Iron Router 自动发布?
How to wait for subscribtion Iron Router with auto-publish?
我实际上正在使用 Meteor 开发 WebApp。因为我更关注 UI 和规范,而不是准备生产和查看安全问题。(我会在完成良好的 PoC 之后再做)。
我想保留 autopublish 和 insecure 包(该死的快点太酷了)。
我在使用 Iron Router 时遇到了一个恼人的问题。
问题很简单,但我找不到使它正常工作的方法。有时数据 return 随机未定义。
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();
}
});
其实也不是随机的,我猜是这样的:
当我从应用程序 link 开始这条路线时工作正常(我想数据已经准备好了)
但在页面刷新时,或按 url 导航时,我可能会有这个烦人的未定义。
一切都是自动发布的,所以在我的路线中使用 waitOn 会很奇怪...
有人遇到同样的问题并得到解决方案吗?
Working well when I hit this route from link from the App (I guess the data is ready)
数据已经存在于客户端。在这种情况下,Iron Router 仅进行客户端路由(即,没有调用到服务器)。
But on page refresh, or on naviguate by the url, I could have this annoying undefined.
在这种情况下,您实际上是在通过 HTTP GET 请求从服务器端请求数据,您可能没有为此定义任何路由。
编辑
关于 HTTP GET 请求我错了。似乎无论我们从浏览器加载哪个link,Meteor 服务器都会发送整个构建。整个构建加载到客户端后,Iron Router 根据 URL 路径决定加载哪个模板。
似乎在页面 load/refresh 上,页面在从服务器端接收数据之前呈现。这是获得 undefined
.
的最可能原因
将此侦听器附加到客户端数据库以检查它何时被服务器更新:
if (Meteor.isClient) {
Stuffs.find().observe({
added: function(doc) {
console.log("Updated Stuffs : ", JSON.stringify(doc));
}
});
}
明白了!
比我想象的要简单!
与此问题相关:
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();
}
});
在做任何事情之前测试东西是否未定义,所以东西不会被使用 -> 没有错误。更新时挂钩将重新运行,完成。
就是这样。非常酷和简单,我什至没有想到!
我实际上正在使用 Meteor 开发 WebApp。因为我更关注 UI 和规范,而不是准备生产和查看安全问题。(我会在完成良好的 PoC 之后再做)。
我想保留 autopublish 和 insecure 包(该死的快点太酷了)。
我在使用 Iron Router 时遇到了一个恼人的问题。 问题很简单,但我找不到使它正常工作的方法。有时数据 return 随机未定义。
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();
}
});
其实也不是随机的,我猜是这样的:
当我从应用程序 link 开始这条路线时工作正常(我想数据已经准备好了)
但在页面刷新时,或按 url 导航时,我可能会有这个烦人的未定义。
一切都是自动发布的,所以在我的路线中使用 waitOn 会很奇怪...
有人遇到同样的问题并得到解决方案吗?
Working well when I hit this route from link from the App (I guess the data is ready)
数据已经存在于客户端。在这种情况下,Iron Router 仅进行客户端路由(即,没有调用到服务器)。
But on page refresh, or on naviguate by the url, I could have this annoying undefined.
在这种情况下,您实际上是在通过 HTTP GET 请求从服务器端请求数据,您可能没有为此定义任何路由。
编辑
关于 HTTP GET 请求我错了。似乎无论我们从浏览器加载哪个link,Meteor 服务器都会发送整个构建。整个构建加载到客户端后,Iron Router 根据 URL 路径决定加载哪个模板。
似乎在页面 load/refresh 上,页面在从服务器端接收数据之前呈现。这是获得 undefined
.
将此侦听器附加到客户端数据库以检查它何时被服务器更新:
if (Meteor.isClient) {
Stuffs.find().observe({
added: function(doc) {
console.log("Updated Stuffs : ", JSON.stringify(doc));
}
});
}
明白了! 比我想象的要简单!
与此问题相关: 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();
}
});
在做任何事情之前测试东西是否未定义,所以东西不会被使用 -> 没有错误。更新时挂钩将重新运行,完成。
就是这样。非常酷和简单,我什至没有想到!