Meteor 为什么要在Iron路由器控制器中调用collection.find
我已经建立了一个小流星应用程序的基础上产生的代码的优秀项目。这段代码可以工作并将集合呈现到页面,但有一件事我感到困惑 代码的子集如下所示: router.jsMeteor 为什么要在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
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({})
};
}