Javascript 在backbone.js应用程序中有球员列表的主客场球队?
A.我的级别:简介我刚刚完成了《杰弗里之路》中的主干.js课程。我已经掌握了诀窍,但是我该如何构建一个拥有4个团队(橙色、蓝色、绿色、黄色)然后每个团队拥有5-8名玩家的应用程序呢Javascript 在backbone.js应用程序中有球员列表的主客场球队?,javascript,jquery,backbone.js,Javascript,Jquery,Backbone.js,A.我的级别:简介我刚刚完成了《杰弗里之路》中的主干.js课程。我已经掌握了诀窍,但是我该如何构建一个拥有4个团队(橙色、蓝色、绿色、黄色)然后每个团队拥有5-8名玩家的应用程序呢 B.描述代码:下面是代码。我有一个App.Models.Player模型,一个App.Views.HomePlayer和App.Views.AwayPlayer视图,然后有一个App.Collections.PlayersList集合,然后是集合
B.描述代码:下面是代码。我有一个
App.Models.Player
模型,一个App.Views.HomePlayer
和App.Views.AwayPlayer
视图,然后有一个App.Collections.PlayersList
集合,然后是集合
的视图,它将每个玩家模型显示为一个列表,我在主玩家视图和客场玩家视图中呈现相同的集合
。我不知道如何将他们与团队联系起来?如果我要创建两个集合,我不想创建太多集合或太多视图,我正在尝试找出如何使其尽可能最小化和可读,我需要一些指导:)
C.要求:这里没什么特别的,我需要一份4支球队的名单,然后每支球队5-8名球员(总共约20-25名球员,然后需要将他们与特定球队联系起来),我需要确定当前选择的球队是主队还是客队。主队和客队是可以互换的,我想在双方都有一个相同球队的名单并隐藏它们,然后显示当前正在比赛的球队,我只是不确定是否有比这更好的方法 最后一句话:是的,我正在使用
窗口
在chrome的console.log中进行测试。。当我得到一些动力时,它将被移除
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>You have arrived.</h1>
<div class="app">
<button type="button"class="add">ADD</button>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src="http://underscorejs.org/underscore.js"></script>
<script src="http://backbonejs.org/backbone.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/backbone-localstorage.js/1.1.0/backbone.localStorage-min.js"></script>
<!-- Templates -->
<script type="text/template" id="home-template">
<div style="float: left; width: 47%;">Name: <%= name %> - Points: <%= points %><button class="btn"></button></div>
</script>
<!-- Templates -->
<script type="text/template" id="away-template">
<div style="float: right; width: 47%;">Name: <%= name %> - Points: <%= points %><button class="btn"></button></div>
</script>
<script>
$(function(){
//Name spacing
window.App = {
Models: {},
Collections: {},
Views: {},
Router: {}
};
/*** OUR MODEL OF A PLAYER... PLAYER MODEL then SINGLE PLAYER VIEW ***/
// Player Model
// ----------
// Our **Player** model has `name`, `points`, and `rebounds` attributes.
window.App.Models.Player = Backbone.Model.extend({
// Default attributes for the player item.
defaults: {
name: "Michael",
points: 10,
rebounds: 9
}
});
// Single player view
// ---------------
// This is a view of how a player should look.
window.App.Views.HomePlayer = Backbone.View.extend({
//el is a list tag.
tagName: "li",
// Cache the template function for a single item.
template: _.template($('#home-template').html()),
events: {
'click .btn': 'mikeAlert'
},
mikeAlert: function() {
alert('get food');
},
// Re-render the titles of the todo item.
render: function() {
this.$el.html( this.template( this.model.toJSON() ) );
return this;
}
});
// Single player view
// ---------------
// This is a view of how a player should look.
window.App.Views.AwayPlayer = Backbone.View.extend({
//el is a list tag.
tagName: "li",
// Cache the template function for a single item.
template: _.template($('#away-template').html()),
events: {
'click .btn': 'mikeAlert'
},
mikeAlert: function() {
alert('get food');
},
// Re-render the titles of the todo item.
render: function() {
this.$el.html( this.template( this.model.toJSON() ) );
return this;
}
});
/*** END PLAYER MODEL SETUP ***/
/*** OUR PLAYERS COLLECTION... PLAYERS COLLECTION then PLAYERS COLLECTION VIEW ***/
// Players Collection
// ---------------
// We connect the players collection to the player model
// The collection of players is backed by *localStorage* instead of a remote
// server.
window.App.Collections.PlayersList = Backbone.Collection.extend({
// Reference to this collection's model.
model: App.Models.Player
// Save all of the player items under the `"players-backbone"` namespace.
//localStorage: new Backbone.LocalStorage("players-backbone"),
});
// Players Collection View
// ---------------
// Display a list of all player*s* here.
window.App.Views.Players = Backbone.View.extend({
// Instead of generating a new element, bind to the existing skeleton of
// the App already present in the HTML.
el: $(".app"),
initialize: function() {
this.render();
},
render: function() {
this.collection.each(this.addOne, this);
return this;
},
addOne: function(model) {
//Create a new child view
var homeplayer = new App.Views.HomePlayer({ model: model });
var awayplayer = new App.Views.AwayPlayer({ model: model });
//Then append it to the root, this
this.$el.append( homeplayer.render().el );
this.$el.append( awayplayer.render().el );
}
});
/*** END PLAYER*S* COLLECTION SETUP ***/
// Dummy Collection, new instance of *App.Collections.PlayersList*
// ---------------
window.players = new App.Collections.PlayersList([
{
name: 'McGee',
points: '14'
},
{
name: 'Joe E',
points: '21'
},
{
name: 'Mike',
points: '8'
}
]);
//Create new instaces to initialize each view
// New *App.Views.Player* instance, need to instantiate to set the model in the view.
// ------------
window.playersView = new App.Views.Players({ collection: players });
});
</script>
</body>
</html>
因此,我想我不需要创建一个新的集合/模型等,我只需要添加球员的球队名称,然后在类中添加球队名称,并且只显示特定的球队及其球员。。下面是jSON数组。如果有更好的方法,请解释我正在学习并进入主干网以获得更好的开发工具
window.players = new App.Collections.PlayersList(
[
{
team: 'Green',
name: 'McGee',
points: '14'
},
{
team: 'Green',
name: 'Joe E',
points: '21'
},
{
team: 'Green',
name: 'Mike',
points: '8'
},
{
team: 'Blue',
name: 'Eli',
points: '14'
},
{
team: 'Blue',
name: 'Michael',
points: '21'
},
{
team: 'Blue',
name: 'Tim',
points: '8'
}
]
);
编辑
添加了JSFIDLE:
不确定这是否是您想要实现的。在这个演示中,我将玩家分配到团队中,这可能会也可能不会满足您未来的所有需求。(但我们总能改进):)
==原始答案===
我不确定我是否完全理解你的要求…所以你想在一个视图中显示所有玩家?展示他们的球队名称和球队?球员名单的顺序是什么
但是:
要将玩家分配给团队,只需在团队模型中将其作为属性传递即可
哦,是的,我认为你需要一个团队模型:
App.Models.Team = Backbone.Model.extend({
//team stuff
});
App.Collections.Teams = ... //usually you want a collection too
然后
var blueTeam = new App.Models.Team({
name: 'blue team',
players: new App.Collection.Players([
{"name": "Mike", "points": 10 },
{ "name": "Joe", "points": 13 },
{ "name": "Kobe", "points": 23 }
]);
});
主队和客队,或者只是当前选定的队,可以只是团队模型上的一个属性。如果要更改它们,只需更改团队模型上的属性即可。例如
var blueTeam = new App.Models.Team({
//other attributes and players
selected: true,
side: 'home'
});
您也可以将这些状态附加到集合,但我不建议这样做。(让我们考虑一下,如果这是一个真实的应用程序,那么团队有很多:玩家,而玩家属于:团队)
但您希望将所有玩家都列在一个列表中(如果我正确理解您的要求),因此我们需要将团队分配给每个玩家,而不是将玩家分配给一个团队:
var mike = new App.Models.Player({
name: 'mike',
team: new App.Models.Team({
name: 'blue'
});
});
但这有一个问题:有20名球员,但只有4支球队,你会让每支球队重复5次,他们都是不同的对象。如果你愿意的话
mike.get('team').set('selected', true);
只有迈克的“团队”会被选中,其他蓝队球员的“团队”不会被更新
解决这个问题
首先,把所有的球员都集合起来。记住,他们需要一个外键,或者任何对他们所属团队的引用:(可以是团队id,也可以只是团队名称)
然后,你的团队,但你不必指定球员:
var teams = new App.Collections.Teams([
{"id": 1, name: "blue team", selected: false, side: ''},
{"id": 2, name: "red team", selected: false, side: ''}
//... all your teams
]);
现在,在你的应用程序中的某个地方为你的玩家分配团队:
players.each(function(player){
player.set("team", teams.get(player.get("team_id")));
});
这样做可以确保同一团队中的所有球员都拥有相同的团队模式
(例如,当代码被调试器暂停时,打开控制台,尝试与玩家_1、玩家_2和玩家_3一起玩,1和2在同一个团队中,尝试更改玩家1/2的团队模型上的任何属性,并检查另一个的团队模型)
(另一个例子也是这样做的,当你为玩家_1更新团队时,你会注意到,玩家_2的团队没有更新)
最后,在集合视图中:
addOne: function(model) {
var playerView;
if(model.get("team").isHomeTeam()) { //isHomeTeam is a helper method in team model
playerView = new App.Views.HomePlayer({ model: model });
} else {
playerView = new App.Views.AwayPlayer({ model: model });
}
this.$el.append( playerView.render().el );
}
好的,您还需要将团队集合传递给PlayerList视图,以便知道团队中是否有人发生了更改:
new playersView = new App.Views.Players({
collection: players,
teams: teams
});
在视图定义中跟踪团队更改:
App.Views.Players = Backbone.View.extend({
initialize: function(options) {
this.teams = options.teams;
this.teams.on('change', this.render, this); //if any of the team changes, rerender everyting
this.render();
}
});
而且,你可能会想,这根本没有效率:每次你换主客场球队时,所有球员都必须被重新渲染。我如何重构它
首先,我认为不必为player视图定义两个视图——它们有太多重复的代码!它不干
让我们定义一个适用于任何玩家的视图(至少目前是这样):
你明白了,或者你甚至不需要写两个模板,如果他们有太多的重复代码
您需要更新addOne:
//since PlayerView's render() returns html directly...
addOne: function(model) {
this.$el.append(new App.Views.PlayerView({model: model}).render());
}
现在,您不必再将团队传递给您的PlayerView或绑定集合更改事件
在PlayerView的初始化中:
initialize: function() {
//rerender player view, when team is changed!
this.model.on('change', this.render, this);
}
现在,每次您更换任何团队时,都只会更新相关的PlayerView。我是不是说错了这个问题?我有什么需要强调的吗?哇,这看起来棒极了,非常感谢你的时间和努力!你无法想象我有多感激它。。。这可能需要一段时间,我是一个缓慢的学习者…我只是看到了你的模板(在我写答案时没有看到),是的,你甚至不需要定义两个不同的模板。我认为这是一个有趣的问题。如果我的电池没有用完,我可能会在以后发布一个工作的JSFIDLE。(或者它将是tmr)谢谢,所以这很有意义
App.Views.PlayerView = Backbone.View.extend({
tagName: "li",
// events...mikeAlert they are all the same
// you will see why we assign this.template in render instead of initialize
//well or you don't have to assign this.template at all.
render: function() {
var templateSelector = this.model.isHomeTeam() ? "#home-template" : "#away-template";
this.template = _.template($(templateSelector).html());
return this.$el.html(this.template(this.model.toJSON());;
}
});
//since PlayerView's render() returns html directly...
addOne: function(model) {
this.$el.append(new App.Views.PlayerView({model: model}).render());
}
initialize: function() {
//rerender player view, when team is changed!
this.model.on('change', this.render, this);
}