Class: ReactiveBlock

Inherits:
Object show all
Includes:
ReactiveTags
Defined in:
lib/volt/reactive/reactive_block.rb

Instance Method Summary collapse

Methods included from ReactiveTags

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
    # Add trackers

    current_size.upto(size-1) do |index|
      # Get the reactive value for the 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

#curObject



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

#inspectObject



85
86
87
# File 'lib/volt/reactive/reactive_block.rb', line 85

def inspect
  "@#{cur}"
end

#reactive?Boolean

Returns:



4
5
6
# File 'lib/volt/reactive/reactive_block.rb', line 4

def reactive?
  true
end

#setup_listenersObject



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

  # Initial cell tracking
  change_cell_count(@source.size.cur)
end

#teardown_listenersObject



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