当用户点击div
,其中.photo_container
类是视图PhotoListView
的一部分时,会触发一个函数sendSelectedPhotoId
。此函数必须从属于此视图的photo_id
模型中获取属性Photo
,该视图的div .photo_container
元素已被点击,并通过fetch()
将其发送到服务器端。< / p>
问题:到目前为止,我设法在单击sendSelectedPhotoId
时触发函数div
,但我无法弄清楚如何获取{{1视图的photo_id
模型的属性。我该怎么做到这一点?
另一方面,我不确定是否会发送正确的Photo
。
代码
photo_id
型号&amp;集合
$('#button').click( function() {
// Retrieve photos
this.photoList = new PhotoCollection();
var self = this;
this.photoList.fetch({
success: function() {
self.photoListView = new PhotoListView({ model: self.photoList });
$('#photo_list').html(self.photoListView.render().el);
}
});
});
视图
// Models
Photo = Backbone.Model.extend({
defaults: {
photo_id: ''
}
});
// Collections
PhotoCollection = Backbone.Collection.extend({
model: Photo,
url: 'splash/process_profiling_img'
});
我还尝试将事件处理程序和// Views
PhotoListView = Backbone.View.extend({
tagName: 'div',
events: {
'click .photo_container': 'sendSelectedPhotoId'
},
initialize: function() {
this.model.bind('reset', this.render, this);
this.model.bind('add', function(photo) {
$(this.el).append(new PhotoListItemView({ model: photo }).render().el);
}, this);
},
render: function() {
_.each(this.model.models, function(photo) {
$(this.el).append(new PhotoListItemView({ model: photo }).render().el);
}, this);
return this;
},
sendSelectedPhotoId: function() {
var self = this;
console.log(self.model.get('photo_id'));
self.model.fetch({
data: { chosen_photo: self.model.get('photo_id')},
processData: true,
success: function() {
}});
}
});
PhotoListItemView = Backbone.View.extend({
tagName: 'div',
className: 'photo_box',
template: _.template($('#tpl-PhotoListItemView').html()),
initialize: function() {
this.model.bind('change', this.render, this);
this.model.bind('destroy', this.close, this);
},
render: function() {
$(this.el).html(this.template( this.model.toJSON() ));
return this;
},
close: function() {
$(this.el).unbind();
$(this.el).remove();
}
});
放在我设法正确获取模型属性的sendSelectedPhotoId
中,但我无法弄清楚如何触发PhotoListItemView
事件当reset
集合执行fetch()时。
查看
PhotoList
问题:有了这个,我似乎无法在函数PhotoListItemView = Backbone.View.extend({
tagName: 'div',
className: 'photo_box',
events: {
'click .photo_container': 'sendSelectedPhotoId'
},
template: _.template($('#tpl-PhotoListItemView').html()),
initialize: function() {
this.model.bind('change', this.render, this);
this.model.bind('destroy', this.close, this);
},
render: function() {
$(this.el).html(this.template( this.model.toJSON() ));
return this;
},
close: function() {
$(this.el).unbind();
$(this.el).remove();
},
sendSelectedPhotoId: function() {
console.log('clicked!');
var self = this;
console.log(self.model.get('photo_id'));
self.model.fetch({
data: { chosen_photo: self.model.get('photo_id')},
processData: true,
success: function() {
$(this.el).html('');
}});
}
});
中执行reset
之后触发模型的fetch()
事件,这意味着我无法让它使用sendSelectedPhotoId
的{{1}}重新渲染。
在Chrome的javascript控制台下面的屏幕截图中,我在PhotoListView
完成render()
之后打印出了该集合,似乎已将提取新数据添加到了现有模型,而不是创建2个新模型并删除所有现有模型!
答案 0 :(得分:0)
您已经拥有每个模型的子视图,因此我将click事件处理程序放在子视图中。在子进程中的处理程序中,触发传递this.model的事件,并在父进程中侦听该事件。
根据更新进行更新:
尝试更改
this.model.bind('reset', this.render, this); to
this.model.bind('remove', this.render, this); // model is a collection right?
然后在单击视图后从集合中删除模型。另外,我不认为使用Model.fetch是你真正想做的事情。也许在模型上使用.save或自定义方法?
根据作者的评论更新,显示来自博客的示例库
我不会遵循该博客的建议。如果你专业地使用骨干我不能推荐Thoughtbot ebook。