javascript - 组织一个backbone.js集合?

标签 javascript json backbone.js

如何创建一个按 id 组织的集合(在backbone.js 中)。例如,我认为集合需要按日期、类别、关键字、类型等进行组织是很常见的。就我而言,我正在尝试找到一种优雅的方式来组织玩家组队。

我认为我不需要一个插件,我的目标只是将玩家组织在一个 div 内,同时使用一个干净的 json 文件,这样我就可以有一个组织良好的列表。同样,理想情况下,最好使用一个 json 文件来实现此目的,并构建类似于 json 本身在嵌套方面的结构的 HTML,在我的示例中,league 是所有内容的父级,然后 teamplayers 的父级。

我已经多次阅读了许多 Backbone 教程,并且非常轻松地理解了流程和语法,但所有教程都使用一个集合,以不特定的顺序输出一个简单的列表。

基本上我希望能够创建一个干净的 json 数组,如下所示。然后将其转换为组织良好的 HTML。

{
  "league":
       [{
        "team":"Lakers",
        "players": [
                {
                    "name": "Kobe"
                },
                {
                    "name": "Steve"
                }
        ]
        },
        {
        "team":"Heat",
        "players": [
                {
                    "name": "LeBron"
                },
                {
                    "name": "Mario"
                }
        ]
        }]

}    

所以这个json结构是有效的,但它不是我用过的,它嵌套得更多一些,所以访问模型需要一点不同的技术,我希望了解这种数组是否理想?另外,如果是这样,我如何将 KobeSteve 分组到一个 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');
    }

});

比较器作为函数方法显然更适合更复杂的排序算法,否则比较器作为字符串方法会更好。请记住,该函数方法虽然可以返回字符串(如上所示),但 -11 会是更好的返回值来指示其排序位置。

比较器示例与模型比较

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/

相关文章:

javascript - 如何解决 Unhandled rejection TypeError : Converting circular structure to JSON for jwt. sign

Javascript 函数返回 session 对象

javascript - Angular,通过 bool 值切换 limitTo (自定义 limitTo?)

javascript - 使用 jQuery 数据表显示高级 JSON 数组的问题

javascript - 主干路由和过滤——更好的方法

javascript - Ajax 中止不会在点击时中止,并且重复请求

angularjs - JSON 中位置 0 处出现意外标记 T

javascript - JSON 返回未定义的值

javascript - 如何检查 BackboneJS 中的变量值更改

javascript - 主干关系:关联键将不起作用,除非它与外键相同