我通过JQuery回调调用remove
。元素fadeOut成功,但删除似乎没有被调用,因为在fadeOut调用后无法访问this._id
?
请参阅以下代码中的注释。
'click .destroy' : function (){
console.log(this._id); //This is fine.
$("#"+this._id).fadeOut('slow',function() {
console.log(this._id); //This returns undefined!
Links.remove({_id:temp}); //Thus this does not work...
});
}
但是,当我尝试复制this._id
变量并按Links.remove(temp);
删除时,我得到:Not permitted. Untrusted code may only update documents by ID.” Meteor error
,因为这是客户端代码。
不安全的套餐已开启。
我该如何解决这个问题?
答案 0 :(得分:2)
fadeOut
回调的回调范围与点击处理程序的回调范围不同。 this
与您认为的价值不同。我建议将前一个范围的this
存储在一个变量中:
'click .destroy' : function (){
var that = this;
console.log(that._id);
$("#"+this._id).fadeOut('slow',function() {
console.log(that._id);
});
}
此外,默认情况下,来自客户端的代码不允许修改集合。 It's explained below the sample code for remove
。顺便说一句,“不受信任的代码”可以被认为是“客户端代码”。
它是:
collection.allow
答案 1 :(得分:2)
不要使用var that = this
hack,只需将id存储在外部闭包中:
'click .destroy' : function (){
var id = this._id
$("#"+id).fadeOut('slow',function() {
console.log(id);
});
}
我一般认为/自我黑客是最后的手段;大多数情况下,您只需将一个或两个变量存储在外部闭包中,它就会更清晰。