Abris
Abris

Reputation: 1481

Extend Marionette.Controller

I'm trying to create a "base class" for a controller in Backbone.Marionette. I guess this question could be answered by someone with knowledge about backbone aswell since Marionette extend in the same as backbone. What I have done is to first create a Marionette.Controller that will work as a base controller by extending from Marionette.Controller. I have then extended the base controller further to add more specialized functionallity. I'm calling the base controllers initilize function from the child by using the prototype. This seemed to be working fine until I noticed that the base seems to be static. In the example below, the childid will be unique for each instance. The baseid however will be the same for all instances, the latest added baseid.

App.Common.BaseWidget.Controller = Marionette.Controller.extend({
    initialize: function (options) {
        this.model = options.model;
        this.id = options.baseid;
        this.region = options.region;
    }
});

App.Widgets.ChildWidget.Controller = App.Common.BaseWidget.Controller.extend({
    initialize: function (options) {
        App.Common.BaseWidget.Controller.prototype.initialize(options);
        this.id = options.childid;
    }
});
var widgets = []
widgets.push( new App.Widgets.ChildWidget.Controller({ "model": model , "region": region, "baseid": App.newGuid(), childid: App.newGuid() }));

Does anyone know what's causing this?

Upvotes: 1

Views: 1141

Answers (2)

Dmytro Yarmak
Dmytro Yarmak

Reputation: 1018

In backbone You can call parent's methods using __super__ of constructor:

App.Widgets.ChildWidget.Controller = App.Common.BaseWidget.Controller.extend({
    initialize: function (options) {
        this.constructor.__super__.initialize.apply(this, arguments);
        this.id = options.childid;
    }
});

Upvotes: 1

Jonathan Beebe
Jonathan Beebe

Reputation: 5226

You probably need to set the proper scope for initialize:

App.Widgets.ChildWidget.Controller = App.Common.BaseWidget.Controller.extend({
    initialize: function (options) {
        App.Common.BaseWidget.Controller.prototype.initialize.apply(this, arguments);
        this.id = options.childid;
    }
});

Upvotes: 3

Related Questions