4 ms·
I've been using backbone exclusively for my project and I'm not sure anymore if I made the right choice. The "best" thing about backbone is that it forces you
by d0m 16y ago
I've been using backbone exclusively for my project and I'm not sure anymore if I made the right choice.
The "best" thing about backbone is that it forces you to smartly separate your code logic. However, I don't agree with everyone about how lightweight it is. I find myself more and more simply writing the logic/view in different files without using backbone at all. (I do use a lot of underscore thought).
The problem is that, for really simple models/view, backbone is way too verbose. And for complicated use, you need to hack backbone hard to make it do what you want. So, in my opinion (and experience with backbone), it really shines for medium use.
I wish there was a little library built on top of backbone that make it easier for small/complicated use.
I'll give you an example of what I mean: If you have a models that contains other models. At first, I thought that would be builtin, but it is not. So, if you want to do that the backbone way, you really need to hack it so change in inner models propagate to outside models. This behaviour is the kind of thing that a little library could do "for free" on top of backbone.
On a last note, I need to say that I don't like that much the backbone documentation. Don't get me wrong, each function is well explained and after reading all of it you get a good grasp of what backbone can do for you. The problem is that you need to read all of it. I much prefere a small tutorial to get you started and help you understand the philosophy of backbone with a high level of models, collections and controllers. And only then, after I started using it, I would read in depth the function I need.
It's a little bit like if you wanted to learn python by reading all function in the standard. It takes a lot of time and you might not totally get what python is. It's better to follow a simple tutorial which explain the big lines of python, and then, dig deeper in the function you really want.
So, I'm not saying backbone is bad.. in fact, it's probably the best library out there for simple MVC use. I have huge respect for jashkenas and the job is has done.
- raganwald 16y agoIf you have a models that contains other models. At first, I thought that would be builtin, but it is not. So, if you want to do that the backbone way, you really need to hack it so change in inner models propagate to outside models. Can you expound on this requirement, perhaps give an example? I'm very interested in what you want to accomplish.
- d0m 16y agoA post that contains comments. Say you have: { id: 3, text: 'test', comments: [{ cid:4, bleh:5}, {c id:6, bleh:4}] } You give that to a model. It won't automatically create a collection with comments. The idea behind backbone is that I could insert a new comment in the page by simply .add() something to the comments collection. Automatically, that would trigger a add/change event so that my view could update itself. However, it was really quite complicated to obtain that behavior. I know it's a simple example but the more I used backbone, the more "simple" things like that happened where I had to dig into things I shouldn't have to. I feel that simple cases should be simple while I would understand that complicated case might be more complicated. However, with backbone.js, I really feel that simple cases aren't that simple.
- raganwald 16y agoSo given: window.Post = Backbone.Model.extend({...}); window.Comments = Backbone.Collection.extend({...}); var p = new Post( id: 3, text: 'test', comments: [ { cid:4, bleh:5}, {c id:6, bleh:4} ] }); You want some way to declare that comments are Comments, so that it is always the case that: (p.attributes.comments instanceof Comments) === true And you also want: p.attributes.comments.add({...}); To trigger a 'change:comments' event on p, even though you aren't changing the reference to the comments collection, just changing its comments. Do I understand you correctly?
- elliottkember 16y agoI've found myself wanting this, too - I sometimes get confused as to which features I can use between models and collections.i
- d0m 16y agoYes, perfectly.
- raganwald 16y agohttps://github.com/unspace/faux/issues#issue/33 https://github.com/unspace/faux/issues#issue/33
- jashkenas 16y agoDealing with sophisticated configurations of nested models and collections is definitely something that Backbone should be making easier than it is at the moment. I think it would be a great feature to improve for the next release. At the moment, the reason we've held off from any of the proposals, is that they all seem to tightly constrain your data structures and/or patterns of use. You can: * Encode the model type into the JSON data, assuming that arrays map to collections, and nested objects map to models (not always the case). * Employ some sort of mapping function that walks over the incoming JSON data (already possible with "parse"). And there are still a number of open questions: * Does saving an inner model save everything in the outer model as well? * How do nested model updates play with RESTful URLs? * Can I refresh a portion of a nested model from the server-side? * Do I have to adopt some sort of JSON-Path notation to be able to refer to specific attributes of nested models? For these reasons, we've left nested models and collections as something you can choose to implement yourself, as best fits your app. If a good pattern emerges with consensus behind it, I'd love to roll it in to Backbone proper. For the record, DocumentCloud uses a lot of nested collections on models that are lazy loaded and lazy rendered when the data is first requested. For example: displaying all of the annotations on a document, or a gallery of all the document's page images.