2013-03-07 54 views
5

我試圖想出一個很好的方式來包裝我從一個函數中的流星帳戶集合中獲取每個用戶,包括一些原型助手功能和從其他集合計數等。最好的方式來描述碼。有沒有一種很好的方式來包裝每個Meteor.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); 
    } 
}); 

它也很容易落實到一個把手幫手此,更換日E使用的{{currentUser}}像這樣:

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

我想除了這個做的是讓這個當流星返回Meteor.user()或Meteor.users.find({})獲取。 (),它包含這些幫助函數和first_name,last_name等短句柄。

可以以某種方式擴展Meteor.user()還是有一些方法可以做到這一點?

回答

2

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

(這樣似乎不符合「特殊」用戶收集工作)

+0

的擴展集我想你可能會丟失在_tranform功能的'''return'''。 – Diogenes 2013-05-22 15:21:32

+1

這似乎工作,但我認爲它可能會導致後來的麻煩。見github.com/meteor/meteor/issues/810。內部流星碼假設用戶不會被轉換。 – Diogenes 2013-05-22 16:19:57

+0

是的,謝謝。我添加了'返回'。 – georgedyer 2013-05-22 17:03:12

0

您可以使用流星包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

相關問題