|
|
|
@ -1,5 +1,5 @@
|
|
|
|
|
import { STATE_SYMBOL } from '../../../constants.js';
|
|
|
|
|
import { effect, render_effect } from '../../../reactivity/effects.js';
|
|
|
|
|
import { destroy_effect, effect, render_effect } from '../../../reactivity/effects.js';
|
|
|
|
|
import { untrack } from '../../../runtime.js';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -22,38 +22,34 @@ function is_bound_this(bound_value, element_or_component) {
|
|
|
|
|
* @returns {void}
|
|
|
|
|
*/
|
|
|
|
|
export function bind_this(element_or_component, update, get_value, get_parts) {
|
|
|
|
|
effect(() => {
|
|
|
|
|
/** @type {unknown[]} */
|
|
|
|
|
var old_parts;
|
|
|
|
|
/** @type {unknown[]} */
|
|
|
|
|
var old_parts;
|
|
|
|
|
|
|
|
|
|
/** @type {unknown[]} */
|
|
|
|
|
var parts;
|
|
|
|
|
/** @type {unknown[]} */
|
|
|
|
|
var parts;
|
|
|
|
|
|
|
|
|
|
render_effect(() => {
|
|
|
|
|
old_parts = parts;
|
|
|
|
|
// We only track changes to the parts, not the value itself to avoid unnecessary reruns.
|
|
|
|
|
parts = get_parts?.() || [];
|
|
|
|
|
render_effect(() => {
|
|
|
|
|
old_parts = parts;
|
|
|
|
|
// We only track changes to the parts, not the value itself to avoid unnecessary reruns.
|
|
|
|
|
parts = get_parts?.() || [];
|
|
|
|
|
|
|
|
|
|
untrack(() => {
|
|
|
|
|
if (element_or_component !== get_value(...parts)) {
|
|
|
|
|
update(element_or_component, ...parts);
|
|
|
|
|
// If this is an effect rerun (cause: each block context changes), then nullfiy the binding at
|
|
|
|
|
// the previous position if it isn't already taken over by a different effect.
|
|
|
|
|
if (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) {
|
|
|
|
|
update(null, ...old_parts);
|
|
|
|
|
}
|
|
|
|
|
untrack(() => {
|
|
|
|
|
if (element_or_component !== get_value(...parts)) {
|
|
|
|
|
update(element_or_component, ...parts);
|
|
|
|
|
// If this is an effect rerun (cause: each block context changes), then nullfiy the binding at
|
|
|
|
|
// the previous position if it isn't already taken over by a different effect.
|
|
|
|
|
if (old_parts && is_bound_this(get_value(...old_parts), element_or_component)) {
|
|
|
|
|
update(null, ...old_parts);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
effect(() => {
|
|
|
|
|
return () => {
|
|
|
|
|
// Defer to the next tick so that all updates can be reconciled first.
|
|
|
|
|
// This solves the case where one variable is shared across multiple this-bindings.
|
|
|
|
|
effect(() => {
|
|
|
|
|
if (parts && is_bound_this(get_value(...parts), element_or_component)) {
|
|
|
|
|
update(null, ...parts);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
if (parts && is_bound_this(get_value(...parts), element_or_component)) {
|
|
|
|
|
update(null, ...parts);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|