#backbone.js
#backbone.js
Вопрос:
Я создаю интерфейс с backbone поверх API и задаюсь вопросом, почему change
событие не запускается. Выборка и сохранение работают, но шаблон не повторяется.
Коллекция
var Clients = Backbone.Collection.extend({
url: API.host '/clients',
model: Client
});
Модель
var Client = Backbone.Model.extend({
urlRoot: API.host '/clients',
defaults: {
clients: {
number: '',
company: '',
address1: '',
address2: '',
city: '',
zip: '',
country: '',
tax: '',
email: '',
phone: ''
}
}
});
Вид
var ClientsView = Backbone.View.extend({
id: 'content',
initialize: function() {
// instantiate Collection
this.model = new Clients();
// compile Handlebars template
this.tpl = Handlebars.compile(this.template);
// bind change and reset model events to rerender template
this.model.bind('change', this.render);
this.model.bind('reset', this.render);
},
render: function() {
var self = this;
var obj = this.el;
// get clients and set data to handlebars template
$.when(this.model.fetch()).then(function(response) {
$(obj).html(self.tpl(response));
}, function() {
$(obj).html(self.tpl);
});
return this;
},
events: {
"click #client-save": "save"
},
save: function(e) {
// cache target and parent object for quick form access
var obj = e.target;
var parent = $(obj).closest('#client-modal');
var client = new Client({
clients: {
number: parent.find('[name="number"]').val(),
company: parent.find('[name="company"]').val(),
address1: parent.find('[name="address1"]').val(),
address2: parent.find('[name="address2"]').val(),
city: parent.find('[name="city"]').val(),
zip: parent.find('[name="zip"]').val(),
country: parent.find('[name="country"]').val(),
tax: parent.find('[name="tax"]').val(),
email: parent.find('[name="email"]').val(),
phone: parent.find('[name="phone"]').val(),
web: parent.find('[name="web"]').val()
}
});
client.save();
return false;
}
});
Ответ №1:
Вам нужно передать контекст, когда вы связываете свои функции.
this.model.bind(‘change’, this.render, this)
Попробуйте использовать другое имя для экземпляра вашей коллекции.
// Example
this.collectionClients = new Clients();
/
Комментарии:
1.
this.model.bind('change', this.render, this)
получилось! 🙂 Но почему я должен использовать другое имя для своего экземпляра коллекции?2. Когда вы создаете переменную с именем model внутри своего представления, backbone for convention предполагает, что у вас есть модель, прикрепленная к вашему представлению, и это не ваш cenario.
3.
this.collection
было бы обычным именем для свойства коллекции, на ваш взгляд, которое даже имеет ту же специальную обработку, чтоthis.model
и.listenTo
обычно это лучший способ связать события , чемbind
.