Javascript 在视图中附加视图好吗?
起初,我对复杂的事情做了太多的考虑,不知道如何使用backbone.js在列表中创建列表。我最终得到了它,只需为我应用程序中的所有玩家创建一个列表项视图。然后为我的应用程序中的所有团队创建了一个视图 我通过创建一个应用程序视图将它们“粘合”或“附加”在一起,这两个视图都有一个each语句,在这两个视图附加到应用程序视图根之前,我将播放器列表项视图附加到团队视图中。让我给你看看 以下是我在应用程序视图中的渲染方法:我只是不确定这是否是个坏主意,我认为有更好的方法,但这是我唯一成功使用的方法。这对我来说很有意义,我可以毫无问题地在每个视图上运行事件 我问过这个问题,有人告诉我最好创建子视图,我很确定这是一个子视图结构?这个方法有没有漏洞,如果有,我想解释一下为什么这个方法不好,以及我如何改进它。最后但并非最不重要的一点是,我确实关心干净的可维护代码,但最重要的是,我有Javascript 在视图中附加视图好吗?,javascript,backbone.js,Javascript,Backbone.js,起初,我对复杂的事情做了太多的考虑,不知道如何使用backbone.js在列表中创建列表。我最终得到了它,只需为我应用程序中的所有玩家创建一个列表项视图。然后为我的应用程序中的所有团队创建了一个视图 我通过创建一个应用程序视图将它们“粘合”或“附加”在一起,这两个视图都有一个each语句,在这两个视图附加到应用程序视图根之前,我将播放器列表项视图附加到团队视图中。让我给你看看 以下是我在应用程序视图中的渲染方法:我只是不确定这是否是个坏主意,我认为有更好的方法,但这是我唯一成功使用的方法。这对我
团队
用如下HTML结果包装其受人尊敬的玩家
<div>
<ul class="lakers">
<li>Kobe</li>
<li>Pau</li>
</ul>
<ul class="spurs">
<li>Tony</li>
<li>Tim</li>
</ul>
</div>
- 神户
- 加索尔
- 托尼
- 提姆
再一次,我想要一些建设性的批评,主要是将两种观点联系起来的优点和缺点。在我继续之前,我只需要问一下,我想确保当我开始扩展代码时,我没有养成坏习惯或在代码中产生问题,我相信您理解这一点
我问过这个问题,有人告诉我最好创建子视图,我很确定这是一个子视图结构
是的,您知道,而且TeamView
是子视图。然而,这是一个“僵尸视图”。它本身有什么作用吗?视图应负责渲染自身,包括附加其直接子视图,但不知道如何渲染其子视图,即,您应将玩家
集合传递给团队视图
,并将以下逻辑移到团队视图
:
var teamPlayers = this.players.where({team_id: team.get('id')})
_.each(teamPlayers, function(player) {
var playerView = new PlayerView({ model: player });
var playerHtml = playerView.render().el;
$(teamHtml).append(playerHtml);
}, this);
哦,你看,我确实试过了,但是对如何编写
var teamPlayers=this.players.where({team_id:team.get('id')})感到困惑。
我仍然是,team.get
将是未定义的teamPlayers
只在每个团队循环中起作用。我还不知道如何循环团队,有4个团队大约有5-6名玩家。也许我很傻,错过了一些简单的东西,但这让我很开心。我知道很难看到teamPlayers
在做什么,但在players模型上有一个属性team\u id
,需要匹配它的相关团队team.get('id')
可以返回1、2、3或4(4个团队),然后它会将具有team\u id的玩家添加到其受尊敬的团队中。这就是为什么要把球员包装起来并将他们联系起来。@MichaelJosephAubry我认为球员
是团队
的子集合,对吗?您已经将团队
传递到团队视图
;要让它发挥作用,你只需要通过相关的球员。您可以传递整个集合
并让TeamView
进行筛选,也可以在外部进行筛选并将teamPlayers
传递给TeamView
。这应该很容易,否则我就误解了。@MichaelJosephAubry你说团队.get
在团队视图中是未定义的?因为它是作为模型传递的,所以您应该使用this.model.get
来代替它,您知道吗?
var teamPlayers = this.players.where({team_id: team.get('id')})
_.each(teamPlayers, function(player) {
var playerView = new PlayerView({ model: player });
var playerHtml = playerView.render().el;
$(teamHtml).append(playerHtml);
}, this);