【问题标题】:Is there a nice way to wrap each Meteor.user in an object with prototype functions and such?有没有一种很好的方法可以将每个 Meteor.user 包装在具有原型函数等的对象中?
【发布时间】:2015-09-03 08:42:52
【问题描述】:

我正在尝试想出一个很好的方法来将我从 Meteor Accounts 集合中获取的每个用户包装在一个函数中,包括一些原型帮助函数和来自其他集合的计数等。描述这一点的最佳方式是在代码中。

我想包装每个用户的 User 函数如下所示:

// - - - - - -
// USER OBJECT
// - - - - - -

var currentUser = null; // holds the currentUser object when aplicable

function User(fbId) {
    var self   = this,
        u      = (typeof id_or_obj == 'string' || id_or_obj instanceof String ? Meteor.users.findOne({'profile.facebook.id': id_or_obj}) : id_or_obj);

    self.fb_id = parseInt(u.profile.facebook.id, 10),

    // Basic info
    self.first_name = u.profile.facebook.first_name,
    self.last_name  = u.profile.facebook.last_name,
    self.name       = u.name,
    self.birthday   = u.birthday,
    self.email      = u.profile.facebook.email,

    // Quotes
    self.likeCount  = Likes.find({fb_id: self.fb_id}).count() || 0;
}

// - - - - - - -
// USER FUNCTIONS
// - - - - - - -

User.prototype = {

    // Get users avatar
    getAvatar: function() {
        return '//graph.facebook.com/' + this.fb_id + '/picture';
    },

    getName: function(first_only) {
        return (first_only ? this.first_name : this.name);
    }

};

我可以轻松地拥有一个全局“currentUser”变量,它保存有关客户端当前登录用户的信息,如下所示:

Meteor.autorun(function() {
    if (Meteor.user()) {
        currentUser = new User(Meteor.user().profile.facebook.id);
    }
});

将它实现到 Handlebars 助手中也很容易,像这样替换 {{currentUser}} 的使用:

Handlebars.registerHelper('thisUser', function() {
    if (Meteor.user()) {
        return new User(Meteor.user());
    } else {
        return false;
    }
});

除此之外我还想做的是,当 Meteor 返回 Meteor.user() 或 Meteor.users.find({}).fetch() 时,它包含这些帮助函数和短句柄名字、姓氏等

我可以以某种方式扩展 Meteor.user() 还是有什么方法可以做到这一点?

【问题讨论】:

    标签: meteor


    【解决方案1】:

    在 Meteor 0.5.8 中,您可以像这样添加一个变换函数:

    Meteor.users._transform = function(user) { 
      // attach methods, instantiate a user class, etc.
      // return the object
      // e.g.: 
      return new User(user);
    } 
    

    你可以对非用户集合做同样的事情,但你也可以在实例化集合时这样做:

    Activities = new Meteor.Collection("Activities", {
      transform: function (activity) { return new Activity(activity); }
    });
    

    (这种方式似乎不适用于“特殊”用户集合)

    【讨论】:

    • 我认为您可能在 _transform 函数中缺少return
    • 这似乎可行,但我认为这可能会导致以后出现问题。请参阅 github.com/meteor/meteor/issues/810。内部 Meteor 代码假定用户未转换。
    【解决方案2】:

    你可以使用meteor包universe collection

    然后这样做:

    UniUsers.UniUser.prototype = {
        getAvatar: function() {
            return '//graph.facebook.com/' + this.fb_id + '/picture';
        }
    };
    
    var user = UniUsers.findOne();
    console.log(user.getAvatar());
    

    UniUsers 是 Meteor.users 的扩展集合

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2012-09-07
      • 2013-01-09
      • 2021-03-06
      相关资源
      最近更新 更多