У вас возникли проблемы с получением события нажатия кнопки, зарегистрированного в режиме позвоночника. Сам вид отображается очень хорошо, с правильными данными, замещенными в шаблоне, но когда я нажимаю сгенерированную кнопку, ничего не происходит. Есть идеи?
Мое мнение определяется как:
var IndividualNoteView = Backbone.View.extend({
template:$("#indivNoteTemplate").html(),
events: {
'click .removeItem': "buttonClickHandler",
},
initialize : function (options) {
console.log("Creating new indiv note view");
this.options = options || {};
this.gridster = this.options.gridster;
this.noteModel = this.options.noteModel;
this.row = this.options.row;
this.col = this.options.col;
this.el = $("#"+this.noteModel.get("noteId"));
console.log("my domain- "+this.el.selector);
this.noteModel.on('remove', this.destroy_view);
},
render: function(){
var tmpl = _.template(this.template);
this.el = tmpl(this.noteModel.toJSON());
this.gridster.add_widget(tmpl(this.noteModel.toJSON()));
},
buttonClickHandler : function(event){
alert( $(event.currentTarget).text());
return false;
}
});
и мой шаблон (в моем index.html) определяется как:
<script id="indivNoteTemplate" type="text/javascript">
<li id="<%= noteId%>">
<div>Text: <%= text%></div>
<button class="removeItem">Remove</button></li>
</script>
В момент, когда initialize
называется, ваш шаблон не был отображен так this.el = $("#"+this.noteModel.get("noteId"));
вероятно, ничего не выбирает.
Кроме того, Backbone.View создает элемент для вас, поэтому вам не нужно это делать.
В соответствии с документами Backbone ваша функция рендеринга должна, вероятно, больше похожа на эту
render: function(){
var tmpl = _.template(this.template);
this.$el.html(tmpl(this.noteModel.toJSON()));
this.gridster.add_widget(this.$el);
}
Если вы когда-либо захотите установить свойство .el
вручную, вы должны вызвать setElement
для правильной настройки вида Backbone. Вы можете видеть, как это используется здесь внутри.
Вам необходимо установить el
свойство backbone привязывает события к представлениям el
.
например:
el: '#container'
Или вы могли:
id: function()
{
return this.noteModel.get('noteId');
}
а затем использовать this.$el
вместо этого this.el = $("#"+this.noteModel.get("noteId"));
в функции инициализации.
Вам тогда не нужно было бы делать id="<%= noteId%>"
в шаблоне, так как позвоночник будет обрабатывать его для вас.
el
в initialize
. Но даже если el
не задано, по умолчанию создается новый <div>
.