( options: Signal<VirtualizerOptions<TScrollElement, TItemElement>>, )
| 26 | export * from './types' |
| 27 | |
| 28 | function createVirtualizerBase< |
| 29 | TScrollElement extends Element | Window, |
| 30 | TItemElement extends Element, |
| 31 | >( |
| 32 | options: Signal<VirtualizerOptions<TScrollElement, TItemElement>>, |
| 33 | ): AngularVirtualizer<TScrollElement, TItemElement> { |
| 34 | let virtualizer: Virtualizer<TScrollElement, TItemElement> |
| 35 | function lazyInit() { |
| 36 | virtualizer ??= new Virtualizer(options()) |
| 37 | return virtualizer |
| 38 | } |
| 39 | |
| 40 | const virtualizerSignal = signal(virtualizer!, { equal: () => false }) |
| 41 | |
| 42 | // two-way sync options |
| 43 | effect( |
| 44 | () => { |
| 45 | const _options = options() |
| 46 | lazyInit() |
| 47 | virtualizerSignal.set(virtualizer) |
| 48 | virtualizer.setOptions({ |
| 49 | ..._options, |
| 50 | onChange: (instance, sync) => { |
| 51 | // update virtualizerSignal so that dependent computeds recompute. |
| 52 | virtualizerSignal.set(instance) |
| 53 | _options.onChange?.(instance, sync) |
| 54 | }, |
| 55 | }) |
| 56 | // update virtualizerSignal so that dependent computeds recompute. |
| 57 | virtualizerSignal.set(virtualizer) |
| 58 | }, |
| 59 | { allowSignalWrites: true }, |
| 60 | ) |
| 61 | |
| 62 | const scrollElement = computed(() => options().getScrollElement()) |
| 63 | // let the virtualizer know when the scroll element is changed |
| 64 | effect( |
| 65 | () => { |
| 66 | const el = scrollElement() |
| 67 | if (el) { |
| 68 | untracked(virtualizerSignal)._willUpdate() |
| 69 | } |
| 70 | }, |
| 71 | { allowSignalWrites: true }, |
| 72 | ) |
| 73 | |
| 74 | let cleanup: () => void | undefined |
| 75 | afterNextRender(() => (virtualizer ?? lazyInit())._didMount(), { |
| 76 | phase: AfterRenderPhase.Read, |
| 77 | }) |
| 78 | |
| 79 | inject(DestroyRef).onDestroy(() => cleanup?.()) |
| 80 | |
| 81 | return proxyVirtualizer(virtualizerSignal, lazyInit) |
| 82 | } |
| 83 | |
| 84 | export function injectVirtualizer< |
| 85 | TScrollElement extends Element, |
no test coverage detected