Browse Source

fix #377: error on nested `onchange`

wangweimin 2 years ago
parent
commit
904acaf0ca
1 changed files with 9 additions and 2 deletions
  1. 9 2
      pywebio/io_ctrl.py

+ 9 - 2
pywebio/io_ctrl.py

@@ -312,14 +312,21 @@ def trigger_onchange(event_data, onchange_funcs):
     name = event_data['name']
     onchange_func = onchange_funcs[name]
 
+    # save current input name to session, so that the `input_update()` function can get it
     task_id = get_current_task_id()
-    get_current_session().internal_save['onchange_trigger-' + task_id] = name  # used in `pywebio.input.input_update()`
+    onchange_trigger_key = 'onchange_trigger-' + task_id
+    previous_name = get_current_session().internal_save.get(onchange_trigger_key)
+    get_current_session().internal_save[onchange_trigger_key] = name  # used in `pywebio.input.input_update()`
+
     try:
         onchange_func(event_data['value'])
     except Exception as e:
         logger.warning('Get %r in onchange function for name:"%s"', e, name)
     finally:
-        del get_current_session().internal_save['onchange_trigger-' + task_id]
+        if previous_name is None:
+            get_current_session().internal_save.pop(onchange_trigger_key, None)
+        else:
+            get_current_session().internal_save[onchange_trigger_key] = previous_name
 
 
 @chose_impl