non posso chiamare il rendering di super class
Super = Backbone.View.extend({
render : function(){
//super class code here (unable to call)
return this;
}
});
Sub = Super.extend({
render : function(){
//sub class code here (called)
return this;
}
});
var view = new Sub();
view.render();
voglio prima chiamare il rendering sottoclasse e poi il rendering superclasse. in alcuni casi, il rendering superclasse prima e poi il rendering subclasse.
così, è possibile codificare sottoclasse render che chiamare il rendering superclasse prima o dopo secondo il requisito dell'utente, senza cambiare la classe Super e senza cambiare il nome della funzione.
Quindi, cosa mi sto perdendo?
Grazie in anticipo.
risposte:
4 per risposta № 1Potrei mancare qualcosa qui, ma puoi chiamare il metodo di rendering sul prototipo di Super nel tuo Sub.render
funzione :
Super = Backbone.View.extend({
render : function(){
console.log("super render");
return this;
}
});
Sub = Super.extend({
render : function(){
console.log("sub render");
Super.prototype.render.call(this);
return this;
}
});
var view = new Sub();
view.render();
E un violino http://jsfiddle.net/WATqe/
1 per risposta № 2
Un approccio diverso:
Super = Backbone.View.extend({
render : function(){
//super class code here (unable to call)
if (typeof this.postRender === "function") {
this.postRender();
}
return this;
}
});
Sub = Super.extend({
postRender : function(){
//sub class code here (called)
return this;
}
});
var view = new Sub();
view.render();
view.render () chiamerebbe render sul super, che poi chiamerebbe postRender se esiste indipendentemente da dove è definito postRender (super, sub, subsub, ecc.).
AGGIORNAMENTO: Se non riesci a modificare super allora puoi provare:
Sub = Super.extend({
initialize : function () {
if (this.render) {
var render = this.render;
this.render = function () {
render.call(this);
// sub class render code goes here
};
}
}
});
0 per risposta № 3
Puoi costruire il ciclo di vita secondo necessità
per esempio.,
in super
...
preRender_: function () {
// maybe empty, for override
...
},
render_: function () {
// do real render here
...
},
postRender_: function () {
// maybe empty, for override
...
},
render: function () {
preRender_();
render_();
postRender_();
}
nel sub
// override preRender_, render_ or postRender_ as needed