diff --git a/lib/core/renderer.js b/lib/core/renderer.js index b1a6402..93c5a07 100644 --- a/lib/core/renderer.js +++ b/lib/core/renderer.js @@ -2457,17 +2457,20 @@ Renderer.setMethod(function applyElementOptions(element, options, for_sync_rende if (needs_async_work && !for_sync_render) { let renderer = this, - value = val, - value_key = key; + value = val, + value_key = key; Hawkejs.getRenderTasks(element).addPreTask(function prepareValue() { - var that = this, - final_tasks = [], - pre_tasks = [], - tasks = []; + let that = this, + final_tasks = [], + pre_tasks = [], + tasks = []; - Hawkejs.recurseLineTasks([value], pre_tasks, tasks, renderer); + let sub_renderer = renderer.createSubRenderer(); + sub_renderer[Hawkejs.ANCESTOR_ELEMENT] = element; + + Hawkejs.recurseLineTasks([value], pre_tasks, tasks, sub_renderer); final_tasks = final_tasks.concat(pre_tasks).concat(tasks); diff --git a/lib/element/custom_element.js b/lib/element/custom_element.js index c17d133..2f70564 100644 --- a/lib/element/custom_element.js +++ b/lib/element/custom_element.js @@ -1226,6 +1226,10 @@ function renderContentsWithTemplate(element, template, variables, slot_data, ple if (element.constructor.use_new_renderer_scope || renderer?.dialog_open) { renderer = renderer.createSubRenderer(); renderer.scope_id = renderer.getId(); + } else { + // Create a shim so the `ANCESTOR_ELEMENT` symbol + // doesn't break things later + renderer = Object.create(renderer); } if (!pledge) { diff --git a/test/10-expressions.js b/test/10-expressions.js index 3855fce..d4201d2 100644 --- a/test/10-expressions.js +++ b/test/10-expressions.js @@ -1334,8 +1334,56 @@ This should be a converted variable: `, - ], + // Test to see if the listeners are attached to the correct optional + [ + // Prepare the state & variables + (vars) => { + state = {}; + state.my_name = vars.set('my_name', Optional('init')); + state.some_text = vars.set('some_text', Optional('init')); + }, + // Template + ` +
+ + +
+ `, + // Expected result + ` +
+ + +
+ `, + () => { + // Change the second variable (some_text) first + state.some_text.value = '1stchange'; + }, + ` +
+ + +
+ `, + () => { + // Change only the first variable (my_name) first + state.my_name.value = '2ndchange'; + }, + ` +
+ + +
+ `, + ] ]; createReactiveTests(tests); diff --git a/test/helpers/_load.js b/test/helpers/_load.js index 25f7c7d..8699b26 100644 --- a/test/helpers/_load.js +++ b/test/helpers/_load.js @@ -19,4 +19,5 @@ module.exports = function loadHawkejs(hawkejs) { hawkejs.load(test_base + '/helpers/print_attribute.js'); hawkejs.load(test_base + '/helpers/with_prepared_variables.js'); hawkejs.load(test_base + '/helpers/print_variables_element.js'); + hawkejs.load(test_base + '/helpers/state_value_test.js'); } \ No newline at end of file diff --git a/test/helpers/state_value_test.js b/test/helpers/state_value_test.js new file mode 100644 index 0000000..46954c6 --- /dev/null +++ b/test/helpers/state_value_test.js @@ -0,0 +1,11 @@ +/** + * state-value-test element + */ +const StateValueTest = Blast.Bound.Function.inherits('Hawkejs.Element', 'StateValueTest'); + +StateValueTest.setTemplateFile('elements/state_value_test'); + +StateValueTest.defineStateVariable('defbool', { + type : 'boolean', + default : false, +}); \ No newline at end of file diff --git a/test/templates/elements/state_value_test.hwk b/test/templates/elements/state_value_test.hwk new file mode 100644 index 0000000..8585c0a --- /dev/null +++ b/test/templates/elements/state_value_test.hwk @@ -0,0 +1 @@ + \ No newline at end of file