fadeOut元素后如何删除?

时间:2013-11-22 22:48:12

标签: jquery meteor

我通过JQuery回调调用remove。元素fadeOut成功,但删除似乎没有被调用,因为在fa​​deOut调用后无法访问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,因为这是客户端代码。

不安全的套餐已开启。

我该如何解决这个问题?

2 个答案:

答案 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);
    });
}

我一般认为/自我黑客是最后的手段;大多数情况下,您只需将一个或两个变量存储在外部闭包中,它就会更清晰。