S.Dan
S.Dan

Reputation: 1912

Override a custom property in a child view

I have a base view and a child view extending the base view with an attribute called "menu". I tried the following.

var baseView=Backbone.View.extend({
    menu:"#base-menu",
    initialize:function(){
         //some code
    },
    render:function(){
        console.log(this.menu);
    }
});
var childView=baseView.extend({
    initialize:function(){
        baseView.prototype.initialize.apply(this);
        this.menu="#child-menu";
    }
});

But the childView.render() does not output #child-menu it is only set to #base-menu. Why and how to get the child one set?

Note: there are multiple children views.

var baseView = Backbone.View.extend({
  menu: "#base-menu",
  initialize: function() {
    console.log(this.menu);
  },

});

var firstView = baseView.extend({
  initialize: function() {
    baseView.prototype.initialize.apply(this, arguments);
    this.menu = "#child-menu";
    console.log(this.menu);

  }
});

var firstViewInstance = new firstView();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://underscorejs.org/underscore-min.js"></script>
<script src="http://backbonejs.org/backbone-min.js"></script>

Upvotes: 0

Views: 57

Answers (1)

Emile Bergeron
Emile Bergeron

Reputation: 17430

To override a property of a parent "class" with Backbone's extend, just set the property again:

var BaseView = Backbone.View.extend({
    menu: "#base-menu",
    initialize: function() {
        console.log("Base", this.menu);
    },

});

var ChildView =  BaseView.extend({
    menu: "#child-menu", // override directly here
    initialize : function(options) {
        ChildView.__super__.initialize.apply(this, arguments);
        console.log("Child", this.menu);
    }
});

Creating a child view:

var child = new ChildView();

Should output

Base #base-menu
Child #child-menu

Upvotes: 1

Related Questions