Javascript “处理”;无数据“;使用Flow Router和Meteor.js的场景

Javascript “处理”;无数据“;使用Flow Router和Meteor.js的场景,javascript,meteor,router,Javascript,Meteor,Router,我想知道如何使用Meteor的流量路由器处理“无数据”场景。假设我想要一个route/article/:slug,我想在其上呈现一篇文章(由slug字段获取)以及相关注释(单独的集合)。因此,我将定义如下的路线: FlowRouter.route('/article/:slug', { subscriptions: function(params) { this.register('article', Meteor.subscribe('articleSlug', params.sl

我想知道如何使用Meteor的流量路由器处理“无数据”场景。假设我想要一个route
/article/:slug
,我想在其上呈现一篇文章(由
slug
字段获取)以及相关注释(单独的集合)。因此,我将定义如下的路线:

FlowRouter.route('/article/:slug', {
  subscriptions: function(params) {
    this.register('article', Meteor.subscribe('articleSlug', params.slug));
    this.register('comments', Meteor.subscribe('commentsByArticleSlug', params.slug));
  },
  action: function() {
    FlowLayout.render('appLayout', { main: "articleDetail" });
  }
});
在模板中,我将在Sub就绪时显示文章详细信息和注释,直到那时,我将只显示“加载…”文本

但是如果URL中的
:slug
参数与数据库中的任何文章都不匹配怎么办?我不想继续显示“加载…”文本,我想显示某种“未找到文章”消息。如何做到这一点

谢谢你的建议


更新:我还想指出与此问题相关的github讨论:

这不是官方答案,但我会这么做。假设这是一个博客(看起来是这样的),你可以在那里抛出一个条件,类似于404

所以


然后您只需要显示缺少的文章条目。

这可以通过模板完成

Template.articleDetail.helpers ({
   articleFound: articles.find().count() > 0
});

在您的视图中,根据找到的文章的结果呈现正确的内容

谢谢您的两个答案!在测试它们时,我想出了第三种方法:将subs放在
订阅
部分,并将检查放在
操作
部分-在那里,如果没有适合slug的文章,我们可以重定向

FlowRouter.route('/article/:slug', {
  subscriptions: function(params) {
    this.register('article', Meteor.subscribe('articleSlug', params.slug));
    this.register('comments', Meteor.subscribe('commentsByArticleSlug', params.slug));
  },
  action: function() {
    if (Articles.find().count() > 0) {
      FlowLayout.render('appLayout', { main: "articleDetail" });
    }
    else {
      FlowRouter.go('/articlenotfound');
    }
  }
});

如果有一个无效的鼻涕虫怎么办,就像问题提到的那样?我明白了,我回答了一个不同的问题,不是吗?在这种情况下,我会在注册之前将查询存储为变量。我已经更新了我的答案。逻辑也可能是如果(slugCheck){//do something}我想知道什么是最快的方法:
!!(articles.find().count())
!!(articles.findOne())
…我猜!!(articles.find().count())
FlowRouter.route('/article/:slug', {
  subscriptions: function(params) {
    this.register('article', Meteor.subscribe('articleSlug', params.slug));
    this.register('comments', Meteor.subscribe('commentsByArticleSlug', params.slug));
  },
  action: function() {
    if (Articles.find().count() > 0) {
      FlowLayout.render('appLayout', { main: "articleDetail" });
    }
    else {
      FlowRouter.go('/articlenotfound');
    }
  }
});