【发布时间】:2014-02-18 10:37:11
【问题描述】:
我尝试通过添加一个按钮来切换按名称/分数排序的排行榜示例。
我成功添加了事件,但我也想更改按钮上的文本值。
我希望添加的按钮文本值(按 name/score 排序)得到响应式更新(每次单击按钮时),但是它没有这样做,只有在手动单击时才会更新播放器项目。
添加代码:
leaderboard.html(排行榜模板):
<template name="leaderboard">
<div class="leaderboard">
<input type="button" name="sort" value="Sort by {{sort_type}}" class='sort'/>
{{#each players}}
{{> player}}
{{/each}}
</div>
{{#if selected_name}}
<div class="details">
<div class="name">{{selected_name}}</div>
<input type="button" class="inc" value="Give 5 points" />
</div>
{{else}}
<div class="none">Click a player to select</div>
{{/if}}
</template>
leaderboard.js(客户端部分):
if (Meteor.isClient) {
Meteor.startup(function(){
Session.setDefault('sort_order', {score: -1, name: 1});
Session.setDefault('sort', 'name');
});
Template.leaderboard.players = function () {
return Players.find({}, {sort: Session.get('sort_order')});
};
Template.leaderboard.selected_name = function () {
var player = Players.findOne(Session.get("selected_player"));
return player && player.name;
};
Template.leaderboard.sort_type = function() {
return Session.get('sort');
};
Template.player.selected = function () {
return Session.equals("selected_player", this._id) ? "selected" : '';
};
Template.leaderboard.events({
'click input.inc': function () {
Players.update(Session.get("selected_player"), {$inc: {score: 5}});
},
'click input.sort': function(){
var sort_order = Session.get('sort_order');
if (_.isEqual(sort_order, {score: -1, name: 1}) || _.isEqual(sort_order, {score: 1})) {
Session.set('sort_order', {name: 1});
Session.set('sort', 'score');
} else if (_.isEqual(sort_order, {name: 1})){
Session.set('sort_order', {score: 1});
Session.set('sort', 'name');
}
}
});
Template.player.events({
'click': function () {
Session.set("selected_player", this._id);
}
});
}
谢谢!
B.R.
伊恩
【问题讨论】:
-
你能发布你的 HTML 模板、你的辅助函数和按钮的事件处理程序吗?你的 JavaScript 函数看起来不错,但真的很难说,因为代码在部署时都被缩小了。
标签: meteor reactive-programming leaderboard