0

我变得懒惰并添加了以下助手:

// Given a userId, show the username
Handlebars.registerHelper('username', function(userId) {
    // This seems extremely wasteful
    Template.instance().subscribe('user', userId);

    var user = Meteor.users.findOne({ _id: userId });
    if (user) {
        return user.username;
    }   
    return "";
});

是的模板级订阅,非常适合我的原型!我找不到任何人谴责这个想法,但也许那是因为它太愚蠢了,没有人会考虑这样做。你有这种模式的经验,你能推荐一下吗?

我特别担心订阅量,以及它们可能导致的大量重新渲染。

4

2 回答 2

2

从我的角度来看,这不是最明智的做法。当您已经定义了这种助手时,为什么要重新发明轮子。

{{currentUser}}

http://docs.meteor.com/#/full/template_currentuser

需要用户名...{{currentUser.username}}

于 2015-03-26T04:16:30.903 回答
0

通用助手的想法可能还不错,但我会将订阅和名称检索分开以使订阅只运行一次:

Handlebars.registerHelper('userSubscribe', function(userIds) { // make userIds an array
    Template.instance().subscribe('users', userIds); // change your publishing function to take the array
});

Handlebars.registerHelper('userName', function(userId) { 
    var user = Meteor.users.findOne({ _id: userId });
    if (user) {
        return user.username;
    }   
    return "";
});

然后每个模板负责发送它实际想要订阅的用户列表。假设您有一个为简单起见具有以下格式的帖子集合:

{author: user_id, commenter: user_id, text: String}

然后你应该能够像这样使用它:

// JS
Template.myTemplate.helpers({
  getMyUsers: function() { return [this.author, this.commenter]; }
});

// HTML
<template name='myTemplate'>
  {{userSubscribe getMyUsers}}
  The author is {{userName author}} and the commenter is {{userName commenter}}
</template>

它可能仍然不理想,但它应该只重新渲染一次,而不是在数据到达客户端时为您要查找其名称的每个用户重新渲染。

于 2015-03-26T15:11:45.977 回答