Событие изменения триггера после события щелчка в alpine.js

В следующем примере при нажатии на элемент выбора и изменении значения значение textarea устанавливается на пустое.

У меня также есть кнопки, которые изменяют значение выбора, но это не вызывает событие изменения и не устанавливает значение textarea пустым.

<div x-data="{ select : 1, textarea : 'test' }">
    <div>
        <button x-on:click="select = 1">One</button>
        <button x-on:click="select = 2">Two</button>
        <button x-on:click="select = 3">Three</button>
    </div>

    <div>
        <select name="test" x-model="select" x-on:change="textarea = ''">
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
    </div>
    
    <textarea name="foobar" x-model="textarea">test</textarea>    
</div>

Я могу заставить это работать, обновляя события щелчка на каждой кнопке, как показано ниже.

<button x-on:click="select = 1; textarea = ''">One</button>

Есть ли способ вызвать событие изменения при выборе, независимо от того, запускается ли оно кнопкой или напрямую изменяет значение выбора?

1 ответ

Решение

x-model обновит значение, не вызывая события "изменение".

В вашем случае, я полагаю, вы хотите, чтобы select изменения, сбросьте значение textarea на ''".

Что вы можете сделать, используя x-init а также $watch('select', () => { textarea = '' }). В качестве бонуса вам не понадобитсяx-on:change="textarea = ''" на <select> больше нет.

Полный пример:

<div
  x-data="{ select : 1, textarea : 'test' }"
  x-init="$watch('select', () => { textarea = '' })"
>
    <div>
        <button x-on:click="select = 1">One</button>
        <button x-on:click="select = 2">Two</button>
        <button x-on:click="select = 3">Three</button>
    </div>

    <div>
        <select name="test" x-model="select">
            <option value="1">One</option>
            <option value="2">Two</option>
            <option value="3">Three</option>
        </select>
    </div>
    
    <textarea name="foobar" x-model="textarea">test</textarea>    
</div>
Другие вопросы по тегам