Sha256: d52288faf8f5f16f4a7f1570593186ccc1cb21736deeaf6694c62e284c82e621

Contents?: true

Size: 1.99 KB

Versions: 8

Compression:

Stored size: 1.99 KB

Contents

require 'glimmer/data_binding/observable'
require 'glimmer/data_binding/observer'

module Glimmer
  module DataBinding
    class ElementBinding
      include Observable
      include Observer
      
      attr_reader :element, :property, :translator, :sub_property
      def initialize(element, property, translator: nil)
        @element = element
        if (property_parts = property.to_s.match(Glimmer::Web::ElementProxy::REGEX_CLASS_NAME_SUB_PROPERTY))
          @property, @sub_property = property_parts.to_a.drop(1)
        elsif (property_parts = property.to_s.match(Glimmer::Web::ElementProxy::REGEX_STYLE_SUB_PROPERTY))
          @property, @sub_property = property_parts.to_a.drop(1)
          @sub_property = @sub_property.gsub('_', '-')
        else
          @property = property
        end
        @translator = translator

        if @element.respond_to?(:remove)
          unregister_handler = lambda { |dispose_event| unregister_all_observables }
          @element.handle_observation_request('on_remove', unregister_handler)
        end
      end
      
      def call(value)
        evaluated_property_value = evaluate_property
        converted_value = @translator&.call(value, evaluated_property_value) || value
        if converted_value != evaluated_property_value
          if @sub_property
            if @property.to_s == 'class_name'
              @element.class_name_included(@sub_property, converted_value)
            elsif @property.to_s == 'style'
              @element.style_property(@sub_property, converted_value)
            end
          else
            @element.send("#{@property}=", converted_value)
          end
        end
      end
      
      def evaluate_property
        if @sub_property
          if @property.to_s == 'class_name'
            @element.class_name_included(@sub_property)
          elsif @property.to_s == 'style'
            @element.style_property(@sub_property)
          end
        else
          @element.send(@property)
        end
      end
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
glimmer-dsl-web-0.6.4 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.6.3 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.6.2 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.6.1 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.6.0 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.5.0 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.4.4 lib/glimmer/data_binding/element_binding.rb
glimmer-dsl-web-0.4.3 lib/glimmer/data_binding/element_binding.rb