@surface/custom-element
Version:
Provides support of directives and data binding on custom elements.
25 lines (24 loc) • 1.18 kB
JavaScript
import { setValue } from "@surface/core";
import { scheduler } from "../singletons.js";
import AsyncObserver from "./async-observer.js";
export default class DataBind {
static observe(target, observables, listener, lazy = false) {
const subscriptions = observables.map(path => DataBind.oneWay(target, path, listener, lazy));
return { unsubscribe: () => subscriptions.splice(0).forEach(x => x.unsubscribe()) };
}
static oneWay(root, path, listener, lazy = false) {
const observer = AsyncObserver.observe(root, path, scheduler);
const subscription = observer.subscribe(listener);
if (!lazy) {
observer.notify();
}
return subscription;
}
static twoWay(left, leftPath, right, rightPath) {
const leftListener = (value) => setValue(value, right, ...rightPath);
const rightListener = (value) => setValue(value, left, ...leftPath);
const leftSubscription = DataBind.oneWay(left, leftPath, leftListener, true);
const rightSubscription = DataBind.oneWay(right, rightPath, rightListener);
return [leftSubscription, rightSubscription];
}
}