Backbone.js嵌套对象结构

Backbone.js nested object structure

本文关键字:结构 对象 嵌套 js Backbone      更新时间:2023-09-26

我正在做一个项目,我们的数据模型基本上是这样的。。。

var library = {
    location: 'Somewhere'
    books: [
    {
        name: 'Good Book',
        publisher: 'Great publisher'
        authors: [
        {
            name: 'Joe Schmoe',
            age: '65'
        },
        {
            name: 'Robert Smith',
            age: '47'
        }
    }  
}

我正试图找出布置模型结构的最佳方式。

类似。。。

var LibraryModel = Backbone.Model.extend({});
var Book = Backbone.Model.extend({});
var Books = Backbone.Collection.extend({
    model: Book
});
var Author = Backbone.Model.extend({});
var Authors = Backbone.Collection.extend({
    model: Author
});

这是解决这个问题的最佳方法吗?还有人面对过这样的事情吗?

无论您是否需要N到N、1到N或任何关系,这在很大程度上都是后端问题。除非您严格处理CRUD屏幕,否则主干模型通常不会直接转换为后端模型,尽管它们通常近似于后端模型。

话虽如此,Backbone relational绝对是处理此类情况的好选择。它为处理关系代码提供了一组非常健壮的功能,值得一看

不过,如果你想避开一个大型插件及其相关的配置和需求,有一些简单的技巧可以直接在你的模型中使用。由于您预先了解您的数据结构,因此您可以对需要编写的代码进行大量假设,而不必创建像BB Relational这样非常灵活的系统。

例如,使用上面的数据结构,将图书列表放入图书馆,可以简单到:


Book = Backbone.Model.extend({});
Books = Backbone.Collection.extend({
  model: Book
});
Library = Backbone.Model.extend({
  initialize: function(){
    this.parseBooks();
  },
  parseBooks: function(){
    var data = this.get("books");
    this.unset("books", {silent: true});
    this.books = new Books(data);
  }
});

我已经用了六次这个代码,每次都很好。您可以将相同的模式和假设集扩展到对象模型的每一层。

您可能还需要覆盖模型上的toJSON方法:


Library = Backbone.Model.extend({
  // ... code from above, here
  toJSON: function(){
    var json = Backbone.Model.prototype.toJSON.call(this);
    json.books = this.books.toJSON();
    return json;
  }
});

根据您需要走多远,您可能最终会重新创建BB Relational已经提供的一半功能。如果你有一个足够大的结构,那么使用这样的插件和声明性关系处理可能会更容易。

IMO,在深入了解BB Relational之前,了解这些基本模式,知道如何为自己做到这一点是值得的。但如果时间有限,我会从BB Relational或其他关系映射器开始(我认为现在还有一些)。

我不会用这种方式处理这个问题,因为你有一个N到N的关系,一本书可以有多个作者一位作者很可能写过一本以上的书。

我想看看主干关系插件

它不是默认的主干网,但它是我能想到的最好的方式。

但是,如果您只需要一个小的解决方案您可以将所有作者放在一个集合中,并在图书模型中使用一个简单的作者ID数组。