global binding group

pull/4882/head
Tan Li Hau 5 years ago
parent 25488772e2
commit 64cbc7ba9a

@ -445,8 +445,12 @@ export default class Component {
}); });
} }
extract_imports(node) { extract_imports(node: ImportDeclaration) {
this.imports.push(node); this.imports.push(node);
for (const specifier of node.specifiers) {
const variable = this.var_lookup.get(specifier.local.name);
variable.imported = true;
}
} }
extract_exports(node) { extract_exports(node) {

@ -121,18 +121,30 @@ export default class BindingWrapper {
switch (this.node.name) { switch (this.node.name) {
case 'group': case 'group':
{ {
const binding_group = get_binding_group(parent.renderer, this.node.expression.node); const variable = block.renderer.component.var_lookup.get(this.object);
const use_global_binding_group = variable && (variable.imported || variable.export_name);
block.renderer.add_to_context(`$$binding_groups`); if (use_global_binding_group) {
const reference = block.renderer.reference(`$$binding_groups`); block.chunks.hydrate.push(
b`@add_into_binding_group(${this.snippet}, ${parent.var});`
block.chunks.hydrate.push( );
b`${reference}[${binding_group}].push(${parent.var});`
); block.chunks.destroy.push(
b`@remove_from_binding_group(${this.snippet}, ${parent.var});`
block.chunks.destroy.push( );
b`${reference}[${binding_group}].splice(${reference}[${binding_group}].indexOf(${parent.var}), 1);` } else {
); const binding_group = get_binding_group(parent.renderer, this.node.expression.node);
block.renderer.add_to_context(`$$binding_groups`);
const reference = block.renderer.reference(`$$binding_groups`);
block.chunks.hydrate.push(
b`${reference}[${binding_group}].push(${parent.var});`
);
block.chunks.destroy.push(
b`${reference}[${binding_group}].splice(${reference}[${binding_group}].indexOf(${parent.var}), 1);`
);
}
break; break;
} }
@ -233,7 +245,10 @@ function get_dom_updater(
? x`~${binding.snippet}.indexOf(${element.var}.__value)` ? x`~${binding.snippet}.indexOf(${element.var}.__value)`
: x`${element.var}.__value === ${binding.snippet}`; : x`${element.var}.__value === ${binding.snippet}`;
return b`${element.var}.checked = ${condition};`; return b`
@reattach_binding_group(${binding.snippet}, ${element.var});
${element.var}.checked = ${condition};
`;
} }
if (binding.node.name === 'value') { if (binding.node.name === 'value') {
@ -332,6 +347,11 @@ function get_value_from_dom(
// <input type='checkbox' bind:group='foo'> // <input type='checkbox' bind:group='foo'>
if (name === 'group') { if (name === 'group') {
const variable = renderer.component.var_lookup.get(binding.object);
if (variable && (variable.imported || variable.export_name)) {
return x`@get_global_binding_group_value(${binding.snippet})`;
}
const binding_group = get_binding_group(renderer, binding.node.expression.node); const binding_group = get_binding_group(renderer, binding.node.expression.node);
if (type === 'checkbox') { if (type === 'checkbox') {
return x`@get_binding_group_value($$binding_groups[${binding_group}])`; return x`@get_binding_group_value($$binding_groups[${binding_group}])`;

@ -161,6 +161,7 @@ export interface Var {
hoistable?: boolean; hoistable?: boolean;
subscribable?: boolean; subscribable?: boolean;
is_reactive_dependency?: boolean; is_reactive_dependency?: boolean;
imported?: boolean;
} }
export interface CssResult { export interface CssResult {

@ -126,6 +126,38 @@ export function xlink_attr(node, attribute, value) {
node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value); node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);
} }
const global_binding_group = new WeakMap();
export function add_into_binding_group(array, input) {
if (!global_binding_group.has(array)) {
global_binding_group.set(array, []);
}
global_binding_group.get(array).push(input);
}
export function remove_from_global_binding_group(array, input) {
const binding_group = global_binding_group.get(array);
if (binding_group) {
binding_group.splice(binding_group.indexOf(input), 1);
}
}
export function reattach_global_binding_group(array, input) {
// if the array got reassigned, reattach binding group
if (!global_binding_group.has(array)) {
add_into_binding_group(array, input);
}
}
export function get_global_binding_group_value(array) {
const group = global_binding_group.get(array);
const value = [];
for (let i = 0; i < group.length; i += 1) {
if (group[i].checked) value.push(group[i].__value);
}
return value;
}
export function get_binding_group_value(group) { export function get_binding_group_value(group) {
const value = []; const value = [];
for (let i = 0; i < group.length; i += 1) { for (let i = 0; i < group.length; i += 1) {

@ -12,4 +12,4 @@ export * from './ssr';
export * from './transitions'; export * from './transitions';
export * from './utils'; export * from './utils';
export * from './Component'; export * from './Component';
export * from './dev'; export * from './dev';
Loading…
Cancel
Save