【问题标题】:Backbone fetching data from model vs collection骨干从模型与集合中获取数据
【发布时间】:2015-09-22 01:18:23
【问题描述】:

我创建了一个简单的主干项目,它获取所有书籍的详细信息并在 UI 中显示。我正在从模型中获取所有书籍的详细信息。根本不使用这样的集合

var BookModel= Backbone.Model.extend({
    initialize: function(){
       this.fetchData();
    },

    fetchData: function(){
        this.url= "/get/all_books";

        this.fetch({
            success: success_callback,
            error: error_callback
        })
    }
});

这工作正常。但是为什么我必须使用集合?如果我会使用集合,它将如下所示

var BookModel= Backbone.Model.extend({
    defaults:{
        id:'',
        name: '',
        author: ''
    }
});


var BookCollection= Backbone.Collection.extend({
    model: BookModel,

    initialize: function(){
        this.fetchData();
    },

    fetchData: function(){
        this.url= "/get/all_books";

        this.fetch({
            success: success_callback,
            error: error_callback
        })
    }
});

同样的效果。我不明白为什么在我的情况下使用 Collections。请通过我的示例帮助我理解这个概念,为什么我必须在这里使用集合。我用谷歌搜索了很多,可以找到最佳答案。

谢谢

【问题讨论】:

    标签: javascript backbone.js model-view-controller backbone.js-collections


    【解决方案1】:

    假设您有两条 2 条路线:

    /books
    /books/:id
    

    现在要获取特定书籍,您可以向/book/:id 路由发送请求,其中:id 是书籍的id

    GET /books/1
    < { id: 1, title: 'On the Genealogy of Morality', ... } 
    

    现在,如果您想获得所有书籍会怎样?你向/books路由发送请求。

    GET /books
    < [{ id: 1, title: '...', ... }, { id: 2, title: '...', ... }, ...]
    

    Backbone 遵循同样的原则。单本书的模型。许多书籍的收藏。当您使用集合时,Backbone 会为每本书创建一个模型。将模型用于多个项目是错误的。

    您说“Backbone 为每本书创建一个模型。”。它在哪一步创建?

    它在sync 事件上创建模型,即当获取所有项目的请求完成时。

    ...它对我有什么帮助。就我而言,我总是取所有书,而不是一本书。

    主干集合总是使用主干模型。如果您没有显式设置Collectionmodel 属性,Backbone 将使用普通模型,即集合的model 属性应始终引用模型。

    // https://github.com/jashkenas/backbone/blob/master/backbone.js#L782
    
    // Define the Collection's inheritable methods.
    _.extend(Collection.prototype, Events, {
    
      // The default model for a collection is just a **Backbone.Model**.
      // This should be overridden in most cases.
      model: Model,
    

    将模型视为对象,将集合视为对象数组

    【讨论】:

    • 谢谢。您说“Backbone 为每本书创建一个模型。”。它在哪一步创建?它对我有什么帮助。就我而言,我总是取所有书,而不是一本书。
    【解决方案2】:

    最重要的是,将您的数据划分为逻辑单元(模型)并将它们分组到类别(集合)中,您可以轻松地推理、操作和更改数据。一旦你构建了比你已经构建的更复杂一点的东西,这将成为一个优先事项。关键不在于您获得了一些原本无法获得的神奇功能。毕竟都是javascript。关键是模型和集合提供了有助于构建动态应用程序的数据结构。事实上,总体而言,这就是主干网和 MV* 的全部意义所在,以提供有用的工具和抽象。集合是解决您以后会遇到的大量问题的解决方案,即使您在应用程序中添加了最微小的额外复杂性。

    所以,您问为什么必须使用集合,我猜您已经知道的答案是,您没有必须使用集合。事实上,听起来您根本不需要使用 MV* 库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-31
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      相关资源
      最近更新 更多