Class: ReactiveBlock
Instance Method Summary
collapse
included, #reactive_method_tag
Constructor Details
#initialize(source, check_block, run_block) ⇒ ReactiveBlock
Returns a new instance of ReactiveBlock.
8
9
10
11
12
|
# File 'lib/volt/reactive/reactive_block.rb', line 8
def initialize(source, check_block, run_block)
@source = ReactiveValue.new(source)
@check_block = check_block
@run_block = run_block
end
|
Instance Method Details
#change_cell_count(size) ⇒ Object
We need to make sure we’re listening on the result from each cell, that way we can trigger when the value changes.
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
# File 'lib/volt/reactive/reactive_block.rb', line 39
def change_cell_count(size)
current_size = @cell_trackers.size
if current_size < size
current_size.upto(size-1) do |index|
val = @source[index]
result = @check_block.call(val)
@cell_trackers << result.on('changed') do
puts "RESULT CHANGED: #{index} - #{self.object_id}"
trigger!('changed')
end
end
elsif current_size > size
(current_size-1).downto(size) do |index|
@cell_trackers[index].remove
@cell_trackers.delete_at(index)
end
end
end
|
14
15
16
17
18
|
# File 'lib/volt/reactive/reactive_block.rb', line 14
def cur
val = @run_block.call(@source)
return val
end
|
#event_added(event, scope_provider, first, first_for_event) ⇒ Object
77
78
79
|
# File 'lib/volt/reactive/reactive_block.rb', line 77
def event_added(event, scope_provider, first, first_for_event)
setup_listeners if first
end
|
#event_removed(event, last, last_for_event) ⇒ Object
81
82
83
|
# File 'lib/volt/reactive/reactive_block.rb', line 81
def event_removed(event, last, last_for_event)
teardown_listeners if last
end
|
85
86
87
|
# File 'lib/volt/reactive/reactive_block.rb', line 85
def inspect
"@#{cur}"
end
|
4
5
6
|
# File 'lib/volt/reactive/reactive_block.rb', line 4
def reactive?
true
end
|
#setup_listeners ⇒ Object
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
# File 'lib/volt/reactive/reactive_block.rb', line 20
def setup_listeners
@cell_trackers = []
@setup = false
@added_tracker = @source.on('added') do |_, index|
change_cell_count(@source.size.cur)
end
@removed_tracker = @source.on('removed') do |_, index|
change_cell_count(@source.size.cur)
end
@setup = true
change_cell_count(@source.size.cur)
end
|
#teardown_listeners ⇒ Object
65
66
67
68
69
70
71
72
73
74
75
|
# File 'lib/volt/reactive/reactive_block.rb', line 65
def teardown_listeners
@added_tracker.remove
@added_tracker = nil
@removed_tracker.remove
@removed_tracker = nil
change_cell_count(0)
@cell_trackers = nil
end
|