Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
1

How do I turn off an event listener?

Asked by 5 years ago

The question is basically my problem. I am wondering how I can turn off an event listener but without using a debounce. Can someone help me out here? I just need a link or suggestion on how to do this I don't need you to write me a script. Any help would appreciated. Thanks!

3 answers

Log in to vote
3
Answered by 5 years ago
Edited 5 years ago

Connect returns a signal connection object that allows you to disconnect the listener from the event. You can do this by calling Disconnect on the object

Example

local connection = object.Event:Connect(f)
connection:Disconnect()

Some people create their own APIs for binding events to manage Disconnect better, or just because they don't like using ROBLOX's API. There's no method in the ROBLOX API for disconnecting all listeners from an event, so often you'll see people do something like this...

local EventSignal = {}

local function connectSignal(self, func)
    local connections = self.connections
    local signal = self.bindable.Event:Connect(func)
    connections[#connections + 1] = signal -- add signal to connections
    return -- return some disconnector
end

local function disconnectAll(self)
    local connections = self.connections
    for i = 1, #connections do
        connections[i]:Disconnect() -- disconnect roblox event signal
        connections[i] = nil
    end
end

function EventSignal.new()
    local signal = {}
    local bindable = Instance.new("BindableEvent") -- ref to roblox api
    signal.connections = {}
    signal.bindable = bindable
    signal.Connect = connectSignal
    signal.DisconnectAll = disconnectAll

    setmetatable(signal, { __index = bindable })
    return signal
end

It's not perfect but that's just meant to show you how it can make life while programming a little bit easier if you're managing a lot of events.

0
Thank you! User#21908 42 — 5y
Ad
Log in to vote
1
Answered by
Amiaa16 3227 Moderation Voter Community Moderator
5 years ago

Declare the event connection as a variable. Then you can use Disconnect() on it.

Example:

local ev
ev = part.Touched:Connect(function(hit)
    --stuff
    ev:Disconnect()
end)

Or if you want to use an event only once, you can use event:Wait(), like this:

local hit = part.Touched:Wait()
--stuff
Log in to vote
0
Answered by 5 years ago

You can "disconnect" your Event in various ways.

  1. http://wiki.roblox.com/index.php?title=Destroy_(Method) You can destroy the Event to disconnect it fully, even though you won't be able to use it back again. (Even though you can add a new instance with the same properties as the old Event.

  2. Using :Disconnect() in the event. Here's an example:

-- "PartTouched" is now a identifier for what ":Connect()" returns, which is the event signal for this event.

local PartTouched = Part.Touched:Connect(function()
    print("Part touched")
end)

-- You can use the :Disconnect() method in the event you made a variable with.
PartTouched:disconnect()
1
You cannot "destroy the event". RBXScriptConnection can't be used with Destroy(). I think you meant destroying an object disconnects all of its events. But that's still a bad way to disconnect events, since that's what Disconnect() is for. Also, you wrote "disconnect()" instead of "Disconnect()" on the last line ;p Amiaa16 3227 — 5y

Answer this question