Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在backbone.js应用程序中有球员列表的主客场球队?_Javascript_Jquery_Backbone.js - Fatal编程技术网

Javascript 在backbone.js应用程序中有球员列表的主客场球队?

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集合,然后是集合

A.我的级别:简介我刚刚完成了《杰弗里之路》中的主干.js课程。我已经掌握了诀窍,但是我该如何构建一个拥有4个团队(橙色、蓝色、绿色、黄色)然后每个团队拥有5-8名玩家的应用程序呢


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