namespace Drupal\settings_controller_test\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\SettingsCommand;
class SettingsControllerTestForm extends FormBase
{
public function getFormId() { return 'settings_controller_test_form'; }
public function buildForm(array $form, FormStateInterface $form_state)
{
$form['invoker'] = [
'#type' => 'submit',
'#value' => t('Invoke Callback'),
'#ajax' => [
'callback' => [$this, 'ajaxCallback']
]
];
$form['#attached']['drupalSettings']['myData'] = [1,2,3,4,5];
$form['#attached']['library'][] = 'settings_controller_test/test';
return $form;
}
public function ajaxCallback(array &$form, FormStateInterface $form_state)
{
$response = new AjaxResponse();
#clear old myData settings
$response->addCommand(new SettingsCommand(['myData' => [2[]], TRUE));
#add new data for myData settings
$response->addCommand(new SettingsCommand(['myData' => [2,4]], TRUE));
return $response;
}
public function validateForm(array &$form, FormStateInterface $form_state){}
public function submitForm(array &$form, FormStateInterface $form_state){}
}
setInterval(function ($, Drupal, drupalSettings) {
Drupal.behaviors.myBehaviour = {
attach: function (context) {
//output: [1, 2, 3, 4, 5]
console.log(settingsdrupalSettings.myData);
}, 5000);
AND
$('#test-button'document).once('testClick').bindajaxComplete('click', function(eevent, xhr, settings) {
e.preventDefault(); //output: [2, 4, 3, 4, 5]
console.log(settingsdrupalSettings.myData);
});
}
};
})(jQuery, Drupal, drupalSettings);
The ProblemUPDATE: AfterThe attempt to clear the ajaxCallback is executed settingsmyData array fails.myData reports in Then when I attempt to set myData = [2,4] with merge set as TRUE the consoleleading two elements change to 2,4 and the same as beforeremaining elements in the ajaxCallbackarray are still there.
NOTE: If I change: $response->addCommand(new SettingsCommand(['myData' => [2,4]], TRUE));
to $response->addCommand(new SettingsCommand(['myData' => [2,4]], FALSE));
the myData array remains completely unchanged [1,2,3,4,5]