我想使用 jeditable 编辑我的收藏,其中 modifyCollection 是与 dblclick 事件相关联的功能。我有以下代码:
initialize : function(options) {
view.__super__.initialize.apply(this, arguments);
this.collection = this.options.collection;
this.render();
},
render : function() {
var template = _.template(tpl, {
collectionForTemplate : this.collection ,
});
this.el.html(template);
return this;
},
modifyCollection : function (event){
$('#name').editable(function(value, settings) {
return (value);
}
,
{ onblur: function(value) {
this.modelID=event.target.nameID;
this.collection = this.options.collection;
console.log("This Collection is: " + this.collection); //Shows : undefined
//
this.reset(value);
$(this).html(value);
return (value);
}
});
这个想法是更新模型,然后通过jeditable更新集合。就地编辑工作正常,但问题是,我无法将集合传递给函数。我想在本地保存对我的集合的所有更改,并在以后将它们发送到服务器。我在这里做错了什么?
答案 0 :(得分:1)
如果其他人找到此帖子,请将评论移至正式答案。
this
函数中的onblur()
未指向此集合。尝试在var self = this;
功能中添加modifyCollection()
,然后在onblur()
更改this.collection
中添加self.collection
,如下所示:
modifyCollection : function (event) {
var self = this; // Added this line
// When working with functions within functions, we need
// to be careful of what this actually points to.
$('#name').editable(function(value, settings) {
return (value);
}, {
onblur: function(value) {
// Since modelID and collection are part of the larger Backbone object,
// we refer to it through the self var we initialized.
self.modelID = event.target.nameID;
self.collection = self.options.collection;
// Self, declared outside of the function refers to the collection
console.log("This Collection is: " + self.collection);
self.reset(value);
// NOTICE: here we use this instead of self...
$(this).html(value); // this correctly refers to the jQuery element $('#name')
return (value);
}
});
});
更新 - 关于自我的预感说明
@muistooshort提到self
实际上是窗口的属性,所以如果你没有在代码中声明var self = this;
,你将引用一个窗口obj。如果您不确定为什么self
似乎存在但似乎不起作用,可能会加剧。
此类编码的常见用法倾向于使用that
或_this
代替self
。你被警告了。 ; - )