3

我有以下代码:

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

我想更清楚地组织它:

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

问题是(我相信控制台中的错误)这会覆盖Template.leaderboard对象的所有现有方法并替换它。

是否有可能将这些方法添加到对象中,同时使用上面显示的符号保留现有方法?

4

3 回答 3

3

您可以像在第一个示例中所做的那样一次添加它们,也可以使用将对象与另一个对象合并的方法,例如 jQuery 的.extend

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

使用后一种方法,您还需要首先确定它Template.leaderboard确实存在!

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

如果实际上跨多个 JS 文件定义,则上述代码将是典型Template的,并且允许您继续添加方法而无需考虑文件实际加载的顺序。

于 2013-02-02T22:44:00.387 回答
2

我认为您正在寻找模板助手

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;
    }
});
于 2013-02-02T22:48:53.610 回答
0

这里有一篇文章在不使用 jquery 或任何其他库的情况下回答了这个问题。

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

来源:(如何动态合并两个 JavaScript 对象的属性?)。

在你的情况下:

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;
于 2013-02-02T23:01:14.850 回答