Backbone fetching data from model vs collection

2020-07-27 03:45发布

问题:

I created a simple backbone project, where it fetches all books details and show it in UI. I am fetching all the books details from the model. not at all using collection something like this

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

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

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

This is working fine. But why do I have to use collections ? If I would have used collection it would be something like as follows

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
        })
    }
});

The same effect. I don't understand why to use Collections in my case. please help me to understand this concept with my example why do I have to use collections here. I Googled a lot and could find the best answer.

Thanks

回答1:

Imagine that you have two 2 routes:

/books
/books/:id

Now for getting a specific book you can send a request to /book/:id route, where :id is the id of the book.

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

Now what happens if you want to get all the books? You send a request to /books route.

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

Backbone follows the same principle. Model for a single book. Collection for many books. When you use a collection, Backbone creates one Model for each book. Using a Model for more than one item is wrong.

You said "Backbone creates one Model for each book.". at what step it creates?

It creates the models on the sync event, i.e. when the request for getting all the items is complete.

...how does it helps me. In my case I always fetch all books, not single book.

Backbone Collections always use Backbone Models. If you don't set the model property of the Collection explicitly, Backbone uses a normal Model, i.e. the model property of a Collection should always refer to a 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,

Consider a Model as an object and a Collection as an array of objects.



回答2:

More than anything, dividing your data into logical units (models) and grouping them into categories (collections) make it easy for you to reason about, manipulate and change your data. Once you build something that is even just a tiny bit more complex than what you have built, this becomes a priority. The point isn't that you are getting some magic functionality that you couldn't otherwise get. It's all javascript after all. The point is that models and collections provide data-structuring that is helpful when building dynamic applications. In fact that's the whole point of backbone and MV* in general, to provide helpful tools and abstractions. Collections are a solution to a whole host of problems that you will run into later down the road, when you add even the tiniest bit of extra complexity to your app.

So, you ask why you have to use collections and I guess the answer that you already knew is, you don't have to use collections. In fact, it sounds like you don't need to use an MV* library at all.