如何创建一个按 id 组织的集合(在backbone.js 中)。例如,我认为集合需要按日期、类别、关键字、类型等进行组织是很常见的。就我而言,我正在尝试找到一种优雅的方式来组织玩家组队。
我认为我不需要一个插件,我的目标只是将玩家组织在一个 div 内,同时使用一个干净的 json 文件,这样我就可以有一个组织良好的列表。同样,理想情况下,最好使用一个 json 文件来实现此目的,并构建类似于 json 本身在嵌套方面的结构的 HTML,在我的示例中,league
是所有内容的父级,然后 team
是 players
的父级。
我已经多次阅读了许多 Backbone 教程,并且非常轻松地理解了流程和语法,但所有教程都使用一个集合,以不特定的顺序输出一个简单的列表。
基本上我希望能够创建一个干净的 json 数组,如下所示。然后将其转换为组织良好的 HTML。
{
"league":
[{
"team":"Lakers",
"players": [
{
"name": "Kobe"
},
{
"name": "Steve"
}
]
},
{
"team":"Heat",
"players": [
{
"name": "LeBron"
},
{
"name": "Mario"
}
]
}]
}
所以这个json结构是有效的,但它不是我用过的,它嵌套得更多一些,所以访问模型需要一点不同的技术,我希望了解这种数组是否理想?另外,如果是这样,我如何将 Kobe
、Steve
分组到一个 div 中,可能是类名 Lakers
,同时显然将其与 LeBron 分开
和 Mario
将这两个内容保留在一个 div 中,也许还有一个 Heat
类。
我可以使用的另一个例子就像电影集合中的 Actor 一样,json 格式是否理想(对我来说似乎如此),在这里我显然将 Actor 分组到他们尊敬的电影中?我非常感谢一些关于构建一个干净的 View 或使用一个或多个模板来输出这种漂亮整洁的 View 的提示。
{
"movies":
[{
"title":"Prisoners",
"actors": [
{
"name": "Hugh Jackman"
},
{
"name": "Jake Gyllenhaal"
}
]
},
{
"title":"Elysium",
"actors": [
{
"name": "Matt Damon"
},
{
"name": "Jodie Foster"
}
]
}]
}
再次使用这个 json 数据和backbone.js,如何为此数组创建可维护的 View ?
最后说明:我能够使用两个 json 文件成功地将玩家分组到团队中,并分配与团队 ID 匹配的玩家和 ID,然后使用内部的玩家集合循环团队集合在哪里
组织它(我正在尝试更好地重新思考这一点)。对我来说,这并没有利用 Backbone 优势,它可能会让人感到困惑,而且对我来说似乎是错误的。所以我再次希望在这里提高我的知识并变得更好。我非常感谢清晰简洁的信息,我真的很难理解这个主题:)
谢谢!!
最佳答案
将您的 JSON 保持在 Backbone 友好的结构中,这意味着您的模型一旦放入集合中就可以轻松组织。
JSON 示例
[
{ league : 1, team : 'lakers', player : 'kobe' }
{ league : 1, team : 'lakers', player : 'steve' }
// And so on
]
考虑到大多数 Backbone 集合都是通过 RESTful JSON API 构建的,这很容易直接提取到集合中然后进行排序。每次将模型添加到集合中时,或者当您要求它运行时,都会运行集合上的 comparator()
函数。
主干集合示例
var Players = Backbone.Collection.extend({
initialize : function() {
// Grab the JSON from the API
// this.fetching is now a deferred object
this.fetching = this.fetch();
}
// Comparator example one, as a string
comparator : 'team',
// Comparator example two, as a function
comparator : function(model) {
return model.get('team');
}
});
比较器作为函数方法显然更适合更复杂的排序算法,否则比较器作为字符串方法会更好。请记住,该函数方法虽然可以返回字符串(如上所示),但 -1
或 1
会是更好的返回值来指示其排序位置。
比较器示例与模型比较
comparator : function(modelA, modelB) {
var teamA = modelA.get('team'),
playerA = modelA.get('player'),
teamB = modelB.get('team'),
playerB = modelB.get('player');
if (teamA < teamB) { // string comparison
return 1;
} else if (playerA < playerB} {
return 1;
} else {
return -1;
}
}
现在,每当将模型添加到集合中时,如果使用最后一个示例,则它会按团队然后按玩家姓名排序到正确的位置。
使用集合的简单 View 示例
var ViewExample = Backbone.View.extend({
el : "#example-container",
render : function() {
var self = this;
// Use the deffered object to make sure models are
// all available in the collection before we render
this.collection.fetching.done(function() {
self.collection.each(function(model) {
self.$el.append('<p>' + model.get('player') + '</p>');
});
});
return this;
}
});
// Create the view and pass in the collection
// that will immediately fetch it's models
var view = new ViewExample({
collection : new Players()
});
此处的代码未经测试
关于javascript - 组织一个backbone.js集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20525269/