5

Meteor Accounts Collectionから取得した各ユーザーを、いくつかのプロトタイプヘルパー関数や他のコレクションからのカウントなどを含む関数にラップするための優れた方法を考え出そうとしています。これを説明する最良の方法はコードです。

各ユーザーをラップする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()を返すときに、これらのヘルパー関数とfirst_name、last_nameの短いハンドルが含まれるようにします。 、など。

どういうわけかMeteor.user()を拡張できますか、それともこれを行う方法はありますか?

4

2 に答える 2

2

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); }
});

(この方法は、「特別な」ユーザーコレクションでは機能しないようです)

于 2013-03-14T18:49:36.503 に答える
0

流星パッケージユニバースコレクションを使用できます

そして、そのようにします:

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

var user = UniUsers.findOne();
console.log(user.getAvatar());

UniUsersは、Meteor.usersの拡張コレクションです。

于 2015-09-03T00:42:52.020 に答える