【问题标题】:Confused about Publish/Subscribe and returning results对发布/订阅和返回结果感到困惑
【发布时间】:2013-03-24 08:29:52
【问题描述】:

我正在使用流星,我对发布/订阅文档和使用把手#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;
 };

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

【问题讨论】:

    标签: meteor publish-subscribe


    【解决方案1】:

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

    所以第三段代码可以是:

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

    另请注意,collection.find() 完成的客户端只会查看 miniMongo 存储中的文档...您没有进行搜索通过整个服务器数据库,但仅通过服务器发布给您的文档。

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

    【讨论】:

    • fetch() 调用是否是您所说的“提供数组时的情况”?此外,您能否提供有关应在何处引用订阅方法的任何见解。在一个大型项目中,我们的团队将订阅放在我们最初的 client/app.js 文件中,以便它们首先加载?
    • 是的,fetch() 是我所暗示的,该方法返回一个包含光标中当前文档的数组。至于订阅,这实际上取决于您是想在启动时还是在用户采取某些操作后获取该数据。如果你想在启动时使用它,我建议你将代码插入到 Meteor.startup() 块中,或者在 client/lib/ 中的文件中。阅读 this section in the documentation 以了解 Meteor 中加载内容的顺序。
    • 感谢您提供参考文档。我的列表从未在第一次点击时呈现,但在刷新或重新单击填充按钮后返回。我会问一个更具体的问题来解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多