2013-05-08 68 views
1

我有我的網站上的複選框,每個代表一個事件名稱。如何動態綁定和解除推送上的事件

我綁定和解除綁定到beckboxes上的事件庫,在默認情況下在站點加載所有checkboxex。 這是我的代碼:

var pusher = new Pusher('secret'); 
var channel = pusher.subscribe('latest-news'); 
$("input:checkbox[name=category]:checked").each(function() 
{ 
    channel.bind($(this).val(), function(data) { 
     getNews(data.id); 
    }); 
}); 

function getNews(ids) 
{ 
    $.post("show", {id: ids}) 
      .done(function(data) { 
     $(".c").prepend(data); 
    }); 
} 

這個代碼反應複選框改變:

$(document).ready(function() { 
    $('input:checkbox[name=category]').click(function() { 
     var $this = $(this); 
     // $this will contain a reference to the checkbox 
     if ($this.is(':checked')) { 
      alert('yes'); 
      channel.bind($(this).val(), function(data) { 
       getNews(data.id); 
      }); 
     } else { 
      alert('no'); 
      channel.unbind($(this).val(), function(data) { 
      }); 
     } 
    }); 
}); 

它工作正常,問題是當有人取消再一個複選框再次檢查什麼發生的事情是,他將得到每封郵件的兩倍。 那麼什麼是正確的方式來動態綁定和解除綁定事件,而無需綁定兩次相同的事件。 謝謝

回答

1

正如您所見,channel.unbind function需要兩個參數:eventNamecallbackeventName是一個字符串,參數callback是一個函數引用。當您撥打unbind時,您可能會傳入正確的eventName,但您傳遞的是對不同功能的引用,因此呼叫將失敗。

爲了解決這個問題,你應該有你可以綁定時引用和使用一個單一的功能/解除綁定:

$(document).ready(function() { 
    $('input:checkbox[name=category]').click(function() { 
     var $this = $(this); 
     // $this will contain a reference to the checkbox 
     if ($this.is(':checked')) { 
      alert('yes'); 
      channel.bind($(this).val(), handleEvent); 
     } else { 
      alert('no'); 
      channel.unbind($(this).val(), handleEvent); 
     } 
    }); 
}); 

function handleEvent(data) { 
    getNews(data.id); 
} 

參考文獻:

+0

感謝它現在有效 – 2013-05-08 16:54:51