asciidisco / Backbone.Mutators

Backbone plugin to override getters and setters with logic
http://asciidisco.github.com/Backbone.Mutators
228 stars 30 forks source link

Integrating mutators with backbone.relational #37

Open RomanKapitonov opened 9 years ago

RomanKapitonov commented 9 years ago

I've faced the following issue while trying to integrate Backbone.Mutators with Backbone.Relational which is used to build client side relations and helps to serialize/deserialize data into corresponding json/models.

For example lets assume we have a model (in coffeescript)

@ClientApp.module "Entities", (Entities, App, Backbone, Marionette, $, _) ->
  class Entities.Store extends Entities.RelationalModel

    defaults:
      location: -> new Entities.Location()

    mutators:
      store_name: ->
        @get("location")?.get("name")

What I have now is trying to access related model in mutator will result in an error. That is because backbone.relational haven't yet converted the model's sub-object into an instance of underlying model at the time backbone.mutators serialize data and hence @get('location') will return a json object instead of Entities.Location instance. I've applied a quick fix by changing the library to save get and set methods from Backbone.RelationalModel.

var Mutator     = function () {},
  oldGet      = Backbone.RelationalModel.prototype.get,
  oldSet      = Backbone.RelationalModel.prototype.set,
  oldToJson   = Backbone.RelationalModel.prototype.toJSON;

...

_.extend(Backbone.RelationalModel.prototype, Mutator.prototype);

However i do not really like this fix as far as i will have to apply it every time Backbone.Mutators is updated. Perhaps someone has a more consistent solution? Also please let me know if you need any additional info.

asciidisco commented 9 years ago

Hey,

I´m out of the "Backbone Game" for a couple of months now & basically, after grinding my gears a bit, I don't see a chance to incorporate the plugins better (at least not, with digging deeper into the topic, and I don't see time for doing that).

That means, if you figure out how to integrate it easier/with less effort, I´m happy to change smth. in the plugin, or accept a PR.