2013-11-22 4 views
0

Я вызываю remove через обратный вызов JQuery. Элементы fadeOut успешно, но удаление, по-видимому, не вызвано, потому что this._id недоступен после вызова fadeOut?Как удалить после fadeOut элемента?

См. Комментарии в коде ниже.

'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

Объем обратного вызова для обратного вызова 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
2

Вместо того чтобы использовать var that = this хак, просто хранить идентификатор во внешнем замыкании:

'click .destroy' : function(){ 
    var id = this._id 
    $("#"+id).fadeOut('slow',function() { 
     console.log(id); 
    }); 
} 

Я вообще мнение, что/самостоятельно хаков в крайнем случае; большую часть времени вы можете просто сохранить одну или две переменные во внешнем закрытии, и это будет намного чище.

Смежные вопросы