Skip to main content

Backbone.js - Parsing the response from the server

From past few weeks, I've been learning Backbone.js in great detail and I think it's a great framework that helps you modularize your code easily. Last week I wrote about 'Model validation in constructor' and then started to look at Collections in Backbone. The Model objects can be viewed as table rows and the Collection as a table. A Collection can declare the model property and indicate what kind of data it will hold. I was looking into ways in which a Collection can be populated by fetching the model data from the server. One way to do that is to ask the Model to fetch the data and then add the response to the Collection. The other way of doing this is to fetch the Collection data directly from the server i.e. instead of defining a Model you create a Collection by fetching the data from the server. Usually when you send a request to the server, the response data is essentially a collection of objects. In this case you really don't need a Model to be defined.

In the Collection you can define the 'url' property and specify the URL from which the data has to be retrieved. Once the URL has been defined and an instance of Collection has been created you can call fetch on the instance to send a request to the server. Fetch will send a GET request to the server and wait for the response. While calling fetch you can specify the success and error handlers as arguments to the call:

As you can see I've defined a Collection - CarCollection and an instance of this collection - carCollectionInstance. Then I'm calling fetch on the instance, passing the success and the error callback functions. When you invoke fetch on a collection instance it would send a Ajax request to the server using jQuery's $.ajax(). Therefore it is important for you to include jQuery in the page. The URL that I've specified is a URL referring a REST resource on my ColdFusion server. This REST resource fetches some records from the database and returns the Query data in JSON format:

{"COLUMNS":["BRAND","MODEL","COLOR"],"DATA":[["Ford","Figo","RED"],["Ford","Fiesta","BLACK"],["Honda","CRV","GREEN"],["Honda","CITY","WHITE"]]}

P.S. I'm not including the code for the ColdFusion REST resource that fetches the records from the database. This is beyond the scope of this post, however you can refer to the series of posts that I've written on RESTful WebServices in ColdFusion here - http://www.sagarganatra.com/search/label/REST

The JSON response contains two keys 'COLUMNS' and 'DATA', but essentially it is one JSON object. Since the collection is modified the reset event bound to the collection would be called first and then the success handler:
Inside event d {length: 1, models: Array[1], _byId: Object, _byCid: Object, _callbacks: Object} Inside success d {length: 1, models: Array[1], _byId: Object, _byCid: Object, _callbacks: Object}

You can see that there is only one model object added to the Collection. The Model objection contains the keys 'COLUMN' and 'DATA'. This is not the format in which I wanted my collection to look like. I wanted a collection that looked like this:
{BRAND: "Ford", MODEL: "Figo", COLOR: "RED"} {BRAND: "Honda", MODEL: "CRV", COLOR: "GREEN"} ....

After reading Backbone documentation, I came across the property called parse that can be defined in the Collection. When parse is defined, the response of the fetch is first given to this function and then the reset and success event handlers are invoked. In parse you can modify the collection as per your need and it is very important to return the data from this function:


The return statement in the parse function is very important, because if it's not present then it would result in an empty collection. Now when I log the output, I can see that the collection contains Models in the desired format. Also, you would see that there are four models in collection in both reset and success event handlers.

Comments

Popular posts from this blog

How to use the APP_INITIALIZER token to hook into the Angular bootstrap process

I've been building applications using Angular as a framework of choice for more than a year and this post is not about another React vs Angular or the quirks of each framework. Honestly, I like Angular and every day I discover something new which makes development easier and makes me look like a guy who built something very complex in a matter of hours which would've taken a long time to put the correct architecture in place if I had chosen a different framework. The first thing that I learned in Angular is the use of the APP_INITIALIZER token.

Using MobX to manage application state in a React application

I have been writing applications using React and Redux for quite some time now and thought of trying other state management solutions out there. It's not that I have faced any issues with Redux; however, I wanted to explore other approaches to state management. I recently came across MobX  and thought of giving it a try. The library uses the premise of  `Observables` to tie the application state with the view layer (React). It's also an implementation of the Flux pattern wherein it uses multiple stores to save the application state; each store referring to a particular entity. Redux, on the other hand, uses a single store with top-level state variables referring to various entities.

On GraphQL and building an application using React Apollo

When I visualize building an application, I would think of using React and Redux on the front-end which talks to a set of RESTful services built with Node and Hapi (or Express). However, over a period of time, I've realized that this approach does not scale well when you add new features to the front-end. For example, consider a page that displays user information along with courses that a user has enrolled in. At a later point, you decide to add a section that displays popular book titles that one can view and purchase. If every entity is considered as a microservice then to get data from three different microservices would require three http  requests to be sent by the front-end app. The performance of the app would degrade with the increase in the number of http requests. I read about GraphQL and knew that it is an ideal way of building an app and I need not look forward to anything else. The GraphQL layer can be viewed as a facade which sits on top of your RESTful services o...