我有以下代码:
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
对象的所有现有方法并替换它。
是否有可能将这些方法添加到对象中,同时使用上面显示的符号保留现有方法?
答案 0 :(得分:3)
您可以像在第一个示例中那样一次添加一个,也可以使用将对象与另一个对象合并的方法,例如jQuery的.extend
:
$.extend(Template.leaderboard, {
newMethod1: function() {
...
},
newMethod2: function() {
...
}
});
使用后一种方法,您还需要确保Template.leaderboard
实际存在,首先!
var Template = Template || {};
Template.leaderboard = Template.leaderboard || {};
如果Template
实际上是跨多个JS文件定义的,那么像上面这样的代码是典型的,并且允许您继续添加方法而不考虑文件实际加载的顺序。
答案 1 :(得分:2)
我认为你正在寻找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;
}
});
答案 2 :(得分: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;
}
来源: (How can I merge properties of two JavaScript objects dynamically?)。
在你的情况下:
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;