Другой способ сделать это - вручную переопределить свойство this.el
в конструкторе / инициализаторе представления, используя новый метод View.setElement со ссылкой на Element.node Рафаэля как это:
var NodeView = Backbone.View.extend({
initialize: function (args) {
// create an empty reference to a Raphael rect element
this.element = canvas.rect();
// // overwrite the default this.el by pointing to the DOM object in
// // Raphael. This works for older version of backbone.js
// this.el = this.element.node;
// in backbone 0.9.0+, you are not supposed to override the DOM object
// directly. rather, use the new setElement method which also takes
// care of the cached this.$el jquery object.
this.setElement(this.element.node);
// now that we have overwritten the default this.el DOM object,
// we need to rebind the events
this.delegateEvents(this.events);
},
events: {
"click": "click"
},
click: function(){
alert('clicked');
},
render: function(){
this.element.attr({
x: this.model.get('xPos'),
y: this.model.get('yPos'),
width: 50,
height: 50,
fill: "#EEEEEE",
stroke: "none",
cursor: "move"
});
return this;
}
});
Преимущество здесь в том, что вам нужно редактировать DOM только в одном месте (в функции рендеринга), и вы все равно можете использовать превосходную обработку событий в Backbone.js. Мне удалось получить аналогичное решение для меня с Raphael 2.0. Хотя я немного опоздал на вечеринку, я подумал, что опубликую это, чтобы это могло помочь кому-то еще!