diff --git a/src/components/lists/multi/utils.rs b/src/components/lists/multi/utils.rs index 2193412..7b6d93d 100644 --- a/src/components/lists/multi/utils.rs +++ b/src/components/lists/multi/utils.rs @@ -93,6 +93,12 @@ pub fn use_selectable_list( validation_context.validators.update(|list| list.push(validator.clone())); + on_cleanup(move || { + validation_context.validators.update(|list| { + list.retain(|v| *v.get_untracked().input_name != *validator.get_untracked().input_name) + }); + }); + //#endregion ListController { diff --git a/src/components/lists/single/radio.rs b/src/components/lists/single/radio.rs index 32680ac..86b4ddf 100644 --- a/src/components/lists/single/radio.rs +++ b/src/components/lists/single/radio.rs @@ -96,14 +96,20 @@ pub fn RadioList( dirty.get() && matches!(error.get(), ValidationState::Invalid(_)) }); - let input_state = InputState::new( + let input_state = RwSignal::new(InputState::new( data_member.get_untracked(), error.clone(), dirty.clone() - ); + )); - validation_context.validators.update(|list| list.push(RwSignal::new(input_state))); + validation_context.validators.update(|list| list.push(input_state)); + on_cleanup(move || { + validation_context.validators.update(|list| { + list.retain(|v| *v.get_untracked().input_name != *input_state.get_untracked().input_name) + }); + }); + //#endregion //#region Render Logic diff --git a/src/components/lists/single/select.rs b/src/components/lists/single/select.rs index 7ccc217..3fd6ab6 100644 --- a/src/components/lists/single/select.rs +++ b/src/components/lists/single/select.rs @@ -53,12 +53,18 @@ pub fn Select( let dirty = RwSignal::new(false); let show_errors = Signal::derive(move || dirty.get() && matches!(error.get(), ValidationState::Invalid(_))); - let input_state = InputState::new(data_member.get(), error.clone(), dirty.clone()); + let input_state = RwSignal::new(InputState::new(data_member.get(), error.clone(), dirty.clone())); let validation_context = use_validation_context() .expect("Could not find FormValidationRegistry context"); - validation_context.validators.update(|list| list.push(RwSignal::new(input_state))); + validation_context.validators.update(|list| list.push(input_state)); + + on_cleanup(move || { + validation_context.validators.update(|list| { + list.retain(|v| *v.get_untracked().input_name != *input_state.get_untracked().input_name) + }); + }); //#endregion //#region Event Logic