I just upgrade a site I worked on from Backbone.js 0.5.3 to Backbone.js 0.9.2 When I did I get an undefined for my options parameter that I use in my models initialize method. What has changed from V.5 to V.9
initialize: function( options ) {enter code here
}
Ok here is my model structure. Everything works fine in 0.5.3 but when I use 0.9.2 options no longer works.
this.myModel = Backbone.Model.extend({
defaults: function() {
return {
maxDays: 7,
index: 0
};
},
initialize: function( options ) {
}
})
this.model = new myModel();
In version 0.5.3 options will show all the attributes that were set in the defaults object. but in version 0.9.2 this no longer works it returns undefined. I can not post a link because of the client sensitivity.
The signature of initialize remains unchanged I believe from 0.5 to 0.9. However, you only get options passed in if you pass them to the constructor. Check out the annotated source for Backbone.Model. Whenever you instantiate a new model instance, the constructor does this:
this.initialize.apply(this, arguments);
So whatever you pass to the constructor gets passed unmodified to initialize. So look in your code for cases where you are instantiating a new model instance but not passing 2 arguments (attributes and options).
Based on your code sample, you now need to define initialize
as taking 2 parameters: attributes
and options
and when creating your models, if you want to just pass options do:
var model = new Model(null, options);
or
var model = new Model({}, options);
I think the specific change that broke your code is the switch from calling initialize with explicit arguments in 0.5.3 to using apply and arguments in 0.9.3 like this:
this.initialize.apply(this, arguments);
So in 0.9 you can get access to your defaults through this.attributes
, but they won't come in as a function parameter unless they came in as a parameter to the constructor function.
var MyModel = Backbone.Model.extend({
defaults: {x: 42, y: 43},
initialize: function(attributes, options) {
console.log(arguments, attributes, this.attributes);}
});
var m = new MyModel();
That will log [], undefined, Object
since arguments is empty, attributes is undefined since nothing was passed to the constructor, but the defaults HAVE been set in this.attributes
and are there for you to use.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With