[Yii2] RadioList Button change event

Ciao ragazzi. Sto scervellandomi cercando di intercettare il change event di una RadioList.

Mi sembra una cosa banale, invece non c’è verso di farla funzionare.

Questo nella view:




echo $form->field($model, 'field')->radioList(['Y'=>'Yes','N'=>'No'],['inline'=>true ,'onchange'=>"alert('test')"])->label(false);



se al posto di onchange metto onlick funziona. Ma non va bene perchè Yii, non so perchè, nasconde gli input:radio sostituendoli con nuovi elementi creati a fianco.

In sostanza se clicco in uno spazio vuoto (dove io so esserci il radiobutton nascosto) ho il messaggio di alert. Però ovviamente non va bene per gli ignari utenti.

Ho anche provato usando jquery in un javascript nel seguente modo:




$("input[name='tupe']").on('change', function() {

    if ($(this).val() == 'Y') {

        alert('Y');

    }

    if ($(this).val() == 'N') {

        alert('N');

    }

    alert('test');

});



Ma non c’è niente da fare. Sembra che l’evento “change” non venga mai triggerato. Se anche in quest’ultimo esempio sostituisco “change” con “click” funziona.

Avete qualche idea/suggerimento?

Grazie 1.000

OnChange viene eseguito quando il valore dell’elemento cambia, nel radiobutton non cambia il valore dell’elemento ma cambia l’elemento che selezioni quindi nel tuo caso, onchange non funzionerà.

Inoltre ti consiglio di creare dei moduli JS su Yii2 dichiarando il modulo con una cosa tipo (esempio preso dai commenti di yii.js):




yii.sample = (function($) {

     var pub = {

         // whether this module is currently active. If false, init() will not be called for this module

         // it will also not be called for all its child modules. If this property is undefined, it means true.

         isActive: true,

         init: function() {

             // ... module initialization code go here ...

         },


         // ... other public functions and properties go here ...

     };


     // ... private functions and properties go here ...


     return pub;

 })(jQuery);

Io, ad esempio, mi creo un modulo base della mia app che viene caricato nell’asset principale e poi altri moduli specifici che estendono quello base, caricati quando necessario.

Per leggere i valori di un campo ActiveForm puoi anche utilizzare alcuni metodi forniti da yii.activeForm (vedi yii.activeForm.js), ci sono molte cose da dire ma ti consiglio di leggere prima i commenti dei file .js dentro vendor/yiisoft/yii2/assets e utilizzare firebug o simili per controllare gli oggetti che già hai a disposizione nei form!

Se hai altri dubbi facci sapere.

Ciao Nicola, come sempre grazie. Ho iniziato a studiare questa parte di cui ignoravo totalmente l’esistenza. Ho avisto ad esempio su yii.activeForm.js alcune funzioni utili come “getValue”, che poi se la vai ad esaminare si vede proprio quello che menzionavo, ovvero una IF grossa come una casa se il tipo di input è ‘radio’ o ‘checkbox’ vanno a prendere il $realInput


$realInput = $form.find('input[type=hidden][name="' + $input.prop('name') + '"]');

Però rimango ancora privo dell’elemento “scintilla”, ovvero quale evento devo usare per dire al mio codice JS di essere eseguito.

Perchè tu giustamente mi hai fatto notare che l’elemento radio non cambia valore. Ma allora come intercetto il momento in cui l’utente mi clicca in un radiobutton piuttosto che in un altro? :blink:

Lo so che è un vecchio post, ma meglio tardi che mai! ;)

Hai provato con:




<?php

  $onChangeJs= <<<JS

    console.log($(this).find('input:checked').val());

JS;


?>

<?= $form->field($model, 'il_mio_campo')

                ->inline(true)

                ->radioList(

                    ##DATI##, 

                    [

                        'onchange' => new \yii\web\JsExpression($onChangeJs)

                    ]

); ?>