У меня есть следующие два представления, основанные на Backbone.js.
pg.views.ItemList = Backbone.View.extend({
tagName: "div",
className: "items",
initialize: function() {
_.bindAll(this, 'addOne', 'addSelected')
Items.bind('add', this.addOne);
Items.fetch();
},
// REMOVED
addOne: function(Item) {
console.log($(this.el));
var view = new pg.views.Item({model: Item});
$(this.el).append(view.render().el);
},
addSelected: function(ItemList) {
_.each(ItemList, this.addOne);
return this.el;
},
// REMOVED
});
pg.views.Section = Backbone.View.extend({
tagName: "section",
sectionTemplate: _.template($('#section-template').html()),
events: {
// REMOVED
},
initialize: function() {
_.bindAll(this, 'render', 'close', 'addItemToSection', 'removeItemFromSection');
this.model.bind('change', this.render);
this.model.view = this;
Items = new pg.collections.ItemList;
},
render: function() {
$(this.el).html(this.sectionTemplate(this.model.toJSON()));
this.setContent();
Items.bind('add', this.addItemToSection); // "add" event bind
Items.bind('remove', this.removeItemFromSection); // "remove" event bind
this.addItems();
return this;
},
addItems: function() {
var ids = this.model.get('items');
var view = new pg.views.ItemList;
var items = _.map(ids, function(id){ return Items.get(id); });
$(this.el).append(view.addSelected(items));
},
// FUNCTIONS REMOVED
setContent: function() {
var title = this.model.get('title');
this.$('.title').text(title);
this.title = this.$('.title-input');
this.title.val(title);
},
addItemToSection: function(Item) {
console.log(this.model.get('title'));
// REMOVED
},
removeItemFromSection: function(Item) {
console.log(this.model.get('title'));
// REMOVED
}
});
Вот проблема, с которой я сталкиваюсь.
У меня есть представление, в котором пользователь создает два раздела, скажем, они называются «раздел1» и «раздел2». Эти имена используются в атрибуте title.
Вот какое странное поведение я наблюдаю:
Когда пользователь находится в «разделе 1» и добавляет элемент, запускается событие привязки «добавить», в результате чего в консоль записывается «раздел 2».
Когда пользователь находится в «разделе 1» и добавляет элемент, запускается событие привязки «удалить», в результате чего «раздел 1» записывается в консоль.
Когда пользователь находится в «разделе 2» и добавляет элемент, запускается событие привязки «добавить», в результате чего «раздел 2» записывается в консоль.
Когда пользователь находится в «разделе 2» и добавляет элемент, запускается событие привязки «удалить», в результате чего в консоль записывается «раздел 2», а затем «раздел 1».
Если я привязываю «добавить» внутри представления «pg.views.Section», используя «this.addItemToSection», разве он не должен вызывать только блок «addItemToSection» внутри этого экземпляра?
Единственная строка, которую я вижу, «переопределяет» «это», - это привязка «добавить» в блоке инициализации «pg.views.ItemList». Если эта строка является виновником, как мне предотвратить переопределение «этого» в привязке «добавить» для «раздела 1»?
Items.bind
вместоthis.bind
в нескольких местах. - person Sam   schedule 03.05.2011