Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.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_Backbone.js - Fatal编程技术网

Javascript Backbone.js嵌套对象结构

Javascript Backbone.js嵌套对象结构,javascript,backbone.js,Javascript,Backbone.js,我正在做一个项目,我们的数据模型基本上是这样的 var library = { location: 'Somewhere' books: [ { name: 'Good Book', publisher: 'Great publisher' authors: [ { name: 'Joe Schmoe', age: '65' },

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

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的关系, 一本书可以有多个作者 一位作者很可能写了不止一本书

我想看看插件

它不是默认的主干,但它以我能想到的最好的方式完成了这个任务

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

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

也就是说,主干关系绝对是处理这种情况的好选择。它为处理关系代码提供了一组非常健壮的特性,值得研究

不过,如果您希望避开大型插件及其相关的配置和需求,那么可以在模型中直接使用一些简单的技巧。由于您预先了解数据结构,因此可以对需要编写的代码进行大量假设,而不必创建像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已经提供的一半功能。如果您有足够大的结构,使用这样的插件和声明性关系处理可能会更容易


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

有什么特别的理由这样做吗。books=新书(数据);而不是这个。set('books':新书(数据))?