3

I have the following code:

Template.leaderboard.players = function() {
    return Players.find({}, {sort: {score: -1, name: 1}});
};

Template.leaderboard.selected_name = function() {
    var player = Players.findOne(Session.get("selected_player"));
    return player && player.name;
};

And I would like to organize it more clearly like that:

Template.leaderboard = {
    players: function() {
        return Players.find({}, {sort: {score: -1, name: 1}});
    },
    selected_name: function() {
        var player = Players.findOne(Session.get("selected_player"));
        return player && player.name;
    }
};

The problem is (I believe from the errors in the console) that this overwrites all the existing methods of the Template.leaderboard object and replaces it.

Is there a possibility to add those methods to the object while keeping existing methods using the kind of notation shown above?

Matthieu Napoli
  • 48,448
  • 45
  • 173
  • 261

3 Answers3

3

You can either add them one at a time as you've done in your first example, or you can use a method that merges an object with another, such as jQuery's .extend:

$.extend(Template.leaderboard, {
    newMethod1: function() {
        ...
    },
    newMethod2: function() {
        ...
    }
});

Using the latter method, you also need to be sure that Template.leaderboard actually exists, first!

var Template = Template || {};
Template.leaderboard = Template.leaderboard || {};

Code like the above would be typical if Template is actually defined across multiple JS files, and allows you to keep adding methods without regard to which order the files are actually loaded.

Alnitak
  • 334,560
  • 70
  • 407
  • 495
2

I think you're looking for Template helpers

Template.leaderboard.helpers({
    players: function() {
        return Players.find({}, {sort: {score: -1, name: 1}});
    },
    selected_name: function() {
        var player = Players.findOne(Session.get("selected_player"));
        return player && player.name;
    }
});
Kyle Finley
  • 11,842
  • 6
  • 43
  • 64
0

There is a post here that answers this without the use of jquery or any other library.

function merge_options(obj1,obj2){
    var obj3 = {};
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
    return obj3;
}

Source: (How can I merge properties of two JavaScript objects dynamically?).

In your case:

var newObject = {};

var tempObject = {
    players: function() {
        return Players.find({}, {sort: {score: -1, name: 1}});
    },
    selected_name: function() {
        var player = Players.findOne(Session.get("selected_player"));
        return player && player.name;
    }
};

for (var attrname in Template.leaderboard) {
    newObject[attrname] = Template.leaderboard[attrname];
}

for (var attrname in tempObject) {
    newObject[attrname] = tempObject[attrname];
}

Template.leaderboard = newObject;
Community
  • 1
  • 1
icanc
  • 3,499
  • 3
  • 35
  • 45