Sha256: 395542b16f461a2a1d5448235b7579de0558a3458f2517d59d9be71c0f30234c

Contents?: true

Size: 1.6 KB

Versions: 1

Compression:

Stored size: 1.6 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_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
        unless converted_value == evaluated_property_value
          if @sub_property
            if @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 == 'style'
            @element.style_property(@sub_property)
          end
        else
          @element.send(@property)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
glimmer-dsl-web-0.4.2 lib/glimmer/data_binding/element_binding.rb