Class: Listener

Inherits:
Object show all
Defined in:
lib/volt/reactive/events.rb

Overview

A listener gets returned when adding an ‘on’ event listener. It can be used to clear the event listener.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass, event, scope_provider, callback) ⇒ Listener

Returns a new instance of Listener.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/volt/reactive/events.rb', line 11

def initialize(klass, event, scope_provider, callback)
  @klass = klass
  @event = event
  @scope_provider = scope_provider
  @callback = callback

  if DEBUG && RUBY_PLATFORM == 'opal'
    # puts "e: #{event} on #{klass.inspect}"
    @@all_events ||= []
    @@all_events << self
    
    # counts = {}
    # @@all_events.each do |ev|
    #   scope = (ev.scope_provider && ev.scope_provider.scope) || nil
    #   
    #   # puts `typeof(scope)`
    #   if `typeof(scope) !== 'undefined'`
    #     counts[scope] ||= 0
    #     counts[scope] += 1
    #   end
    # end
    # 
    # puts counts.inspect
    
    `window.total_listeners = window.total_listeners || 0;`
    `window.total_listeners += 1;`
    `console.log(window.total_listeners);`
  end
end

Instance Attribute Details

#scope_providerObject (readonly)

Returns the value of attribute scope_provider.



9
10
11
# File 'lib/volt/reactive/events.rb', line 9

def scope_provider
  @scope_provider
end

Instance Method Details

#call(*args) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/volt/reactive/events.rb', line 49

def call(*args)
  # raise "Triggered on removed: #{@event} on #{@klass2.inspect}" if @removed
  if @removed
    puts "Triggered on removed: #{@event}"
    return
  end
  
  # Queue a live value update
  if @klass.reactive?
    # We are working with a reactive value.  Its receiving an event meaning
    # something changed.  Queue an update of the value it tracks.
    @klass.object_tracker.queue_update
    # puts "Queued: #{ObjectTracker.queue.inspect}"
  end
  
  @callback.call(*args)
end

#inspectObject



95
96
97
# File 'lib/volt/reactive/events.rb', line 95

def inspect
  "<Listener:#{object_id} event=#{@event} scope=#{scope.inspect}#{' internal' if internal?}>"
end

#internal?Boolean

Returns:



41
42
43
# File 'lib/volt/reactive/events.rb', line 41

def internal?
  @internal
end

#removeObject

Removes the listener from where ever it was created.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/volt/reactive/events.rb', line 68

def remove
  # puts "FAIL:" if @removed
  raise "event #{@event} already removed" if @removed
  
  # puts "e rem: #{@event} on #{@klass.inspect}"
  if DEBUG && RUBY_PLATFORM == 'opal'
    @@all_events.delete(self) if @@all_events
    
    `window.total_listeners -= 1;`
    `console.log("Rem", window.total_listeners);`
  end
  
  
  @removed = true
  @klass.remove_listener(@event, self)

  # puts "Removed Listener for: #{@event} - #{@scope_provider && @scope_provider.scope.inspect} from #{@klass.inspect}"

  # We need to clear these references to free the memory
  @scope_provider = nil
  @callback = nil
  # @klass2 = @klass
  @klass = nil
  # @event = nil

end

#scopeObject



45
46
47
# File 'lib/volt/reactive/events.rb', line 45

def scope
  @scope_provider && @scope_provider.scope
end