Search code examples
javascriptflatpickralpine.js

In flatpickr in onChange event value is not assigned with alpinejs


I try to add flatpickr to my livewire 1.3 / alpinejs 2 app and on onChange event I failed to apply selected value to var defined in alpine Component, as :

/* Init alpine Component */
        <div class="hostel_item_commands_row p-3" x-data="hostelViewPageComponent()"  @custom-event="console.log($event.detail.foo)">

new_hostel_enquery_start_date::<div x-html="new_hostel_enquery_start_date"></div>

...
<input
    type='text'
    id="flatpickr_new_hostel_enquery_start_date"
    class="form-control editable_field"
/>

...

<script>
        function hostelViewPageComponent() {

// In onChange of flatpickr this would ref to flatpickr, so I assign self var
            var self = this;
            var fp = flatpickr(document.querySelector('#flatpickr_new_hostel_enquery_start_date'), {
                dateFormat: 'Y-m-d', // 2018-01-21 12:39:36
                altFormat: "F j, Y",
                altInput: true,
                inline: false,
                locale: "en",
                onChange: function(selectedDates, date_str, instance) {
                    console.log('selectedDates::')
                    console.log(selectedDates) //valid
                    console.log('date_str: ', date_str);

                    console.log('self::')
                    console.log(self)  // I check content of self var : https://prnt.sc/u64eug


                    // self.$dispatch('custom-event', { foo: 'bar' , date_str: 'date_str' })
                    // If to uncomment line above I got error : ypeError: self.$dispatch is not a function

                    self.new_hostel_enquery_start_date= date_str
                    console.log('self.new_hostel_enquery_start_date::')
                    console.log(self.new_hostel_enquery_start_date)
                    // looks like value is NOT assigned to my component new_hostel_enquery_start_date var

                }
            });
            // alert( 'AFTER flatpickr::' )
            return {
                new_hostel_enquery_start_date:'-',
                ...

Why self var does not work here? Which is valid way ?

Thanks!


Solution

  • The hostelViewPageComponent function isn't executed with the Alpine.js "this" context set so it's probably defaulting to the window.

    You should move the flapickr initialisation into an init() function and call it using x-init="init()". A function called by reference by x-init should have the correct this context.

    See the following:

    <div class="hostel_item_commands_row p-3" x-init="init()" x-data="hostelViewPageComponent()"
      @custom-event="console.log($event.detail.foo)">
    
      <input type='text' id="flatpickr_new_hostel_enquery_start_date" class="form-control editable_field" />
    
    
    <script>
      function hostelViewPageComponent() {
        return {
          new_hostel_enquery_start_date: '-',
          init: function() {
            // In onChange of flatpickr this would ref to flatpickr, so I assign self var
            var self = this;
            var fp = flatpickr(document.querySelector('#flatpickr_new_hostel_enquery_start_date'), {
              dateFormat: 'Y-m-d', // 2018-01-21 12:39:36
              altFormat: "F j, Y",
              altInput: true,
              inline: false,
              locale: "en",
              onChange: function (selectedDates, date_str, instance) {
                console.log('selectedDates::')
                console.log(selectedDates) //valid
                console.log('date_str: ', date_str);
    
                console.log('self::')
                console.log(self)  // I check content of self var : https://prnt.sc/u64eug
    
    
                // self.$dispatch('custom-event', { foo: 'bar' , date_str: 'date_str' })
                // If to uncomment line above I got error : ypeError: self.$dispatch is not a function
    
                self.new_hostel_enquery_start_date = date_str
                console.log('self.new_hostel_enquery_start_date::')
                console.log(self.new_hostel_enquery_start_date)
                // looks like value is NOT assigned to my component new_hostel_enquery_start_date var
    
              }
            });
          }
        }
      }
    </script>