UNPKG

@surface/custom-element

Version:

Provides support of directives and data binding on custom elements.

25 lines (24 loc) 1.18 kB
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]; } }