Meteor 为什么要在Iron路由器控制器中调用collection.find

Meteor 为什么要在Iron路由器控制器中调用collection.find,meteor,iron-router,Meteor,Iron Router,我已经建立了一个小流星应用程序的基础上产生的代码的优秀项目。这段代码可以工作并将集合呈现到页面,但有一件事我感到困惑 代码的子集如下所示: router.js this.route("articles", {path: "/articles", controller: "ArticlesController"}); Meteor.publish('allArticles', function() { return Articles.find({}); }); Meteor.publi

我已经建立了一个小流星应用程序的基础上产生的代码的优秀项目。这段代码可以工作并将集合呈现到页面,但有一件事我感到困惑

代码的子集如下所示:

router.js

 this.route("articles", {path: "/articles", controller: "ArticlesController"});
Meteor.publish('allArticles', function() {
  return Articles.find({});
});


Meteor.publish('singleArticle', function(articleId) {
  check(articleId, String);
  return Articles.find({_id: articleId});
});
ArticlesController

this.ArticlesController = RouteController.extend({
   template: "Articles",

   onBeforeAction: function() {
        this.next();
    },

   action: function(){
      if (this.isReady()) {
         this.render();
      } else {
         this.render("loading");
      }
   },

   isReady: function() {
      var ready = true;
      var subs = [ Meteor.subscribe('allArticles') ];
      _.each(subs, function(sub) {
         if(!sub.ready())
            ready = false;
      });
      return ready;
   },

   data: function() {
      return {
         articles: Articles.find({})
      };
   }
});
server/pubs/articles.js

 this.route("articles", {path: "/articles", controller: "ArticlesController"});
Meteor.publish('allArticles', function() {
  return Articles.find({});
});


Meteor.publish('singleArticle', function(articleId) {
  check(articleId, String);
  return Articles.find({_id: articleId});
});
据我所知,该代码是如何工作的,发生了以下情况:

(1) 收藏通过所有文章单个文章订阅发布
(2) ArticlesController订阅所有文章
(3) ArticlesController中的data函数将数据(从订阅?)提取到articles数组中,然后将该数组暴露到Blaze模板中

我感到困惑的是:
为什么我们需要在数据函数中查找({})
?我们在哪里访问所有项目数据。。。看来我们要直接回到文章集了,如果我们只订阅了所有文章,那怎么可能呢?

我需要了解更多关于你的应用程序的信息来回答这个问题。你是只看一篇文章,还是有一个页面列出了所有文章

如果您正在查看单篇文章,则需要订阅
单篇
出版物


如果您正在显示文章的列表,则需要订阅
allArticles
。如果有很多文章,你可以通过限制字段的数量来提高你的应用程序的速度。

我需要了解更多关于你的应用程序的信息来回答这个问题。你是只看一篇文章,还是有一个页面列出了所有文章

如果您正在查看单篇文章,则需要订阅
单篇
出版物

如果您正在显示文章的列表,则需要订阅
allArticles
。如果文章很多,你可以通过限制字段的数量来提高应用程序的速度

我们在哪里访问allArticles数据。。。看来我们要回去了 直接提交到文章集,如果我们 你只订阅了所有的文章吗

您可以将其作为数据对象的一部分返回,以便可以在模板中访问它。在
Articles
模板中,您现在可以直接使用
{{{{each Articles}}
而无需帮助函数,因为
Articles
是数据上下文的一部分。您还可以使用
this.articles
访问从您的
文章
模板帮助程序中的控制器
数据
部分返回的文章

为什么我们需要在数据函数中执行Articles.find({})

在控制器数据函数中执行的这些查询作用于客户端minimongo Articles集合,而不是服务器。一旦从服务器发布了信息,并且客户端已经订阅了该信息,客户端就可以在其minimongo实例中使用该信息,但仍然需要以某种方式访问它。基本上,发布使信息可用,但是
Articles.find({})
为客户端访问它

在控制器的数据函数中访问此信息只是为了避免在模板中访问

我认为你的误解来自你所描述的第三步:

ArticlesController中的data函数提取数据(从 订阅?) 火焰模板

data函数从客户端上的minimongo提取数据,该客户端包含来自订阅的信息。Minimongo位于订阅和数据函数之间

我们在哪里访问allArticles数据。。。看来我们要回去了 直接提交到文章集,如果我们 你只订阅了所有的文章吗

您可以将其作为数据对象的一部分返回,以便可以在模板中访问它。在
Articles
模板中,您现在可以直接使用
{{{{each Articles}}
而无需帮助函数,因为
Articles
是数据上下文的一部分。您还可以使用
this.articles
访问从您的
文章
模板帮助程序中的控制器
数据
部分返回的文章

为什么我们需要在数据函数中执行Articles.find({})

在控制器数据函数中执行的这些查询作用于客户端minimongo Articles集合,而不是服务器。一旦从服务器发布了信息,并且客户端已经订阅了该信息,客户端就可以在其minimongo实例中使用该信息,但仍然需要以某种方式访问它。基本上,发布使信息可用,但是
Articles.find({})
为客户端访问它

在控制器的数据函数中访问此信息只是为了避免在模板中访问

我认为你的误解来自你所描述的第三步:

ArticlesController中的data函数提取数据(从 订阅?) 火焰模板


data函数从客户端上的minimongo提取数据,该客户端包含来自订阅的信息。Minimongo位于订阅和数据函数之间。

虽然您没有显示它,但我假设您的代码中有以下行,定义在某个地方,将在服务器和客户端上执行它:

  Articles       = new Mongo.Collection('articles');
/*CollectionName = new Mongo.Collection('DBCollectionName');*/
当这是前男友
data: function() {
  return {
     articles: Articles.find({})
  };
}