2

我创建了一个简单的骨干项目,在该项目中获取所有书籍的详细信息并在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 
     }) 
    } 
}); 

效果相同。我不明白为什么在我的情况下使用集合。请帮我理解这个概念与我的例子为什么我必须在这里使用集合。我GOOGLE了很多,可以找到最好的答案。

感谢

回答

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为每本书创建一个模型。”。它创建的步骤是什么?

它在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, 

考虑一个模型作为对象和收集作为数组对象的。

+0

谢谢。你说过“骨干为每本书创建一个模型”。它创建的步骤是什么?它对我有什么帮助。在我的情况下,我总是拿所有的书,而不是单一的书。 – testzuser

0

更重要的是,将您的数据划分为逻辑单元(模型)并将它们分组成各个类别(集合)可以让您轻松推理,操作和更改数据。一旦你构建的东西比你所创建的东西稍微复杂一点,这就成为当务之急。重点不在于你获得了一些你无法获得的魔法功能。毕竟这都是javascript。关键是模型和集合提供了数据结构化,这在构建动态应用程序时很有用。事实上,这是整个骨干和MV *的重点,以提供有用的工具和抽象。集合是解决大量问题的一种解决方案,当您为应用程序添加最微小的额外复杂性时,您将在后续版本中遇到这些问题。

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