1

我正在使用流星,我对发布/订阅文档和使用车把#each items助手查询/返回集合之间的关系有点困惑。

我知道通过发布和订阅某些文档,当事情发生变化时,我可以在客户端浏览器上进行响应式更新。

我发现我自己编写了非常复杂的(面向角色的)发布函数,并编写了等效的函数以将项目返回给客户端。例如,

Meteor.publish("directory", function () {
    var user = Meteor.users.findOne({_id:this.userId});
    //role and logic left out on purpose
    return Meteor.users.find({}, {fields:{emails:1, profile:1}});
});

和订阅

if (Meteor.userId() != null) {
    Meteor.subscribe("directory");
}

模板称为 show people 和 helper 'users'

 Template.show_people.users = function () {
     users = Meteor.users.find({}).fetch();
     return users;
 };

我的问题是,事情应该这样做吗?我们是否返回我们用于发布的相同查询的列表助手?

4

1 回答 1

1

您可以为#each Handlebars 函数提供一个查询光标。事实上,它是推荐的。通过这种方式,DOM 将会智能更新:当一个文档被添加到 Cursor 时,Handlebars 只会为该文档创建新的 DOM 节点,而不会为已经存在的文档重新创建 DOM 节点。当您提供数组时,情况并非如此。

所以第三段代码可以是:

Template.show_people.users = function () {
     return Meteor.users.find({});
};

另请注意,在客户端完成的collection.find()只会查看 miniMongo 存储中的文档...您不是在搜索整个服务器数据库,而只是通过服务器已发布到的文档你。

因此,只有在 Meteor.publish() 函数内部才需要复杂的、面向角色的逻辑。

于 2013-04-03T01:00:52.527 回答