class Bluesky::PureComponent
A presentation ‘Component`
Public Class Methods
attribute(name, *args)
click to toggle source
# File lib/bluesky/pure_component.rb, line 122 def self.attribute(name, *args) case args.length when 0 define_method(name) do |&block| if block _data.store(name, block) block else _data.fetch(name) end end when 1 if args[0].respond_to?(:call) define_method(name) { _data.fetch(name) { _data.store(name, args[0].call) } } else define_method(name) { _data.fetch(name, args[0]) } end else raise ArgumentError, %{ wrong number of arguments (#{args.length} for 1..2) } end define_method("#{name}=") { |value| _data.store(name, value) } end
inherited(subclass)
click to toggle source
# File lib/bluesky/pure_component.rb, line 76 def self.inherited(subclass) DSL.send(:define_method, subclass.name) do |data = {}, delegate = nil, &block| delegate ||= @delegate component = subclass.new(data, delegate) block.call(component) if block component end @descendants << subclass end
install_hooks(debug=false)
click to toggle source
# File lib/bluesky/pure_component.rb, line 87 def self.install_hooks(debug=false) @descendants.each do |subclass| if subclass.instance_methods.include?(:component_did_mount) || subclass.instance_methods.include?(:component_will_unmount) subclass.class_eval { `Opal.defn(self, '$$mountable', true);` } end if subclass.instance_methods.include?(:component_will_mount) subclass.class_eval { `Opal.defn(self, '$$hook_will_mount', true);` } end subclass.send(:alias_method, :do_render, :render) unless subclass.instance_methods.include?(:do_render) subclass.send(:define_method, :render) do begin $$.console.time("#{subclass.name}:render") if debug %x{ var contents = #{do_render}; if (self.$$mountable) contents.properties.ref = self; return contents; } rescue Object => err warn err div({ class: 'broken', style: { display: :none } }, [err.message]) ensure $$.console.timeEnd("#{subclass.name}:render") if debug end end end end
new(data = {}, delegate = nil)
click to toggle source
# File lib/bluesky/pure_component.rb, line 146 def initialize(data = {}, delegate = nil) @data = data @delegate = delegate end
Public Instance Methods
dispatch(action, *payload, &block)
click to toggle source
# File lib/bluesky/pure_component.rb, line 166 def dispatch(action, *payload, &block) warn 'Missing delegate' unless @delegate root = @delegate root = root.parent while root.respond_to?(:parent) && root.parent root.dispatch(@delegate, action, *payload, &block) end
mount()
click to toggle source
# File lib/bluesky/pure_component.rb, line 173 def mount @mounted = true end
mounted?()
click to toggle source
# File lib/bluesky/pure_component.rb, line 181 def mounted? !!@mounted end
shallow_equal?(a, b)
click to toggle source
# File lib/bluesky/pure_component.rb, line 151 def shallow_equal?(a, b) a.equal?(b) || a.each_pair.all? do |k, v| bk = b[k] v.equal?(bk) || v.eql?(bk) end rescue Object => _ false end
should_render?(previous)
click to toggle source
# File lib/bluesky/pure_component.rb, line 160 def should_render?(previous) # puts "#{self.class.name}:should_render? #{(@delegate && @delegate.force_update?)}, #{!shallow_equal?(_data, previous._data)}" (@delegate && @delegate.force_update?) || !shallow_equal?(_data, previous._data) end
unmount()
click to toggle source
# File lib/bluesky/pure_component.rb, line 177 def unmount @mounted = false end
Protected Instance Methods
_data()
click to toggle source
# File lib/bluesky/pure_component.rb, line 187 def _data @data end