Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Backbone.js Master-Detail scenario

Tags:

backbone.js

I have a classic master-detail scenario that I am implementing in backbone.js.

For the moment I am not concerned with the history and navigation part of backbone.js so I am skipping it.

  • I have a GridView where all the models are fetched and displayed from a rest service.
  • I have a DetailView (modal window) where a particular selected model from a grid is displayed with more fields appearing that in master grid view.

I have implemented:

  • a main application where all the backbone views and routers are attached.
  • the application is initialized on document loaded
  • a main Backbone router (acting more as a classical "controller") with responsibilities for:
    • creating and destroying views
    • fetching and posting data
    • passing data to views
    • coordinating views events

Now the data returned from the rest service for the gridView (Backbone collection) is only some partial data of the models.

So to display the full details of a particular model I have to fetch the details again from the rest service.

Fetching from the model end up with a model disconnected from the collection and any update on it isn't reflected on the collection itself and I have to refresh again the master view fetching all the data.

Destroying and recreating the details view sometimes make it loose the view events.

What would be the correct implementation of this scenario? I am not fully understanding the best way of doing things in backbone.

like image 291
Ronnie Avatar asked Sep 05 '11 13:09

Ronnie


People also ask

Does anyone use Backbone JS?

Backbone. Backbone has been around for a long time, but it's still under steady and regular development. It's a good choice if you want a flexible JavaScript framework with a simple model for representing data and getting it into views.

Is Backbone JS frontend or backend?

Front-End MVC frameworks (Backbone, Angular, etc) all rely on a backend service to provide the data that, say Backbone, would then use as its model. You could have an entire MVC pattern on the backend that accepts requests and spits out some JSON for a frontend MVC framework to use.

What is the significance of edge version of Backbone JS?

js provides framework to web apps by giving demos with value binding and custom events and allocations with an API of enumerable functions and views with reportive event handling and links all to your existing API over an interface.

How does Backbone JS work?

Backbone. js gives structure to web applications by providing models with key-value binding and custom events, collections with a rich API of enumerable functions, views with declarative event handling, and connects it all to your existing API over a RESTful JSON interface.


1 Answers

First, I would suggest returning the full detail for the models in your "gridView" collection query. This solves the 'disconnected collection' issue.

Although, you don't have to do the full collection load - let's say doing a full load for the entire collection is not going to work - the details are too huge, for instance, you should be able to pass the same model from the collection into your detail view, test to see if its a partial load or a full load, and issue a "fetch()" for the model, returning the full data - being that this is the same model as in the collection, it should be updated. Does that make sense?

Also, for the detail views, I would suggest, especially if you're design only calls for one detail view active, to reuse the view and write a function in the view that allows you to swap out the model.

So, in summary:

  • On application start, load one gridView and one detailView.
  • refactor your detailView to allow models to be set on it. (detailView.setModel(..)
  • when the user wants to see the details on a model, pass that model into the detailView using the above function.
  • if the model isn't fully loaded, your setModel method can go and fetch() the rest of the data. You could either test for a specific property that would only be there on full load, or set a property on the model to indicate whether its been fully loaded.
  • If you find yourself losing events, try calling delegateEvents() at the end of your render() function it rebind the events.
  • Since the same model is being used in both the gridView collection and the detailView, assuming you're responding to the change events properly, everything should be synchronized.
like image 72
Edward M Smith Avatar answered Oct 25 '22 15:10

Edward M Smith