Routing 流星及;路由:点击链接可以工作,但从同一URL加载页面不会';T

Routing 流星及;路由:点击链接可以工作,但从同一URL加载页面不会';T,routing,meteor,Routing,Meteor,我使用Meteor和Meteor路由器在我的测试应用程序中提供路由。这是我先前问题的后续: 现在,我已经实现了在这个问题上提供给我的答案。我的路线现在是这样的: Meteor.Router.add({ '/:type/:name': function(type, name) { //just checking the type and name are correct! console.log("type: " + type); console.log("name:

我使用Meteor和Meteor路由器在我的测试应用程序中提供路由。这是我先前问题的后续:

现在,我已经实现了在这个问题上提供给我的答案。我的路线现在是这样的:

Meteor.Router.add({
  '/:type/:name': function(type, name) {

    //just checking the type and name are correct!
    console.log("type: " + type);
    console.log("name: " + name);
    var activity = Activities.findOne({name: name});
    Session.set("currentActivity", activity._id);
    return 'itemPage';
  },
  //more entries here
});
此时,浏览器中的URL可能类似于:

http://localhost:3000/bar/someCoolBar
当我在主页上点击链接进入itemPage时,这段代码工作得非常好。Activitiy.findOne成功找到正确的活动,我可以检索该活动。\u id

但是,如果手动刷新页面,或者在浏览器地址栏中手动键入该URL以直接转到该itemPage,则会出现以下错误:

Uncaught TypeError: Cannot read property '_id' of undefined client.js:34
Meteor.Router.add./:type/:name client.js:34
(anonymous function) router_client.js:59
(anonymous function) router_client.js:31
_.extend._compute deps.js:129
Deps.Computation deps.js:64
_.extend.autorun deps.js:255
Router._setPageFn router_client.js:23
(anonymous function) index.js:278
next index.js:166
page.dispatch index.js:169
page.replace index.js:148
page.start index.js:103
page index.js:60
(anonymous function) router_client.js:176
ready
所以我不明白为什么这不起作用。“type”和“name”的console.log显示了正确的值,因此我认为Activity.findOne()应该按预期工作。但事实并非如此。上面错误日志中的这一行:

Uncaught TypeError: Cannot read property '_id' of undefined client.js:34
对应于my client.js中的这行代码:

Session.set("currentActivity", activity._id);
这告诉我findOne没有找到结果,var活动未定义。 为什么在单击链接时路由会起作用,而在浏览器地址栏中手动输入URL时路由不会起作用


谢谢大家!

当Meteor最初加载到浏览器上时,没有任何可用数据,因此您需要能够说明
活动
返回
null
(对于前面的行)的情况

因为数据仍将从服务器下载(因此没有
\u id
,因此存在未定义的错误)

像这样的东西就可以了:

var activity = Activities.findOne({name: name});
if(activity) Session.set("currentActivity", activity._id);

您还可以使用订阅回调来检查页面何时加载/加载,并在页面上显示它

谢谢您的回答!你能澄清一下订阅回调吗?我不知道如何将其应用到这个场景中。当调用订阅回调时,您可以使用它来确定何时从服务器下载所有数据,即
Meteor.subscribe(“活动”,function(){Session.set(“loaded”,true)})
然后使用
Session.get(“loaded”)
要检查您的应用程序是否仍在加载中,或者是否已在更高延迟的环境中准备就绪,它可以帮助用户了解如果您在模板中使用数据的位置空白太长时间会发生什么
var activity = Activities.findOne({name: name});
if(activity) Session.set("currentActivity", activity._id);