private async Task InitialiseObserver()
        {
            var elementReference = this.IntersectionObserverContext?.Ref?.Current;

            if (elementReference == null || Equals(elementReference, default(ElementReference)))
            {
                throw new Exception(NO_ELEMENT_MESSAGE);
            }

            this.Observer = await this.ObserverService.Observe(elementReference.Value, this.OnIntersectUpdate, this.Options);
        }
        public async ValueTask DisposeAsync()
        {
            var observer = this.Observer;

            if (observer == null)
            {
                return;
            }

            this.Observer = null;
            await observer.Dispose();

            await this.OnDisposed.InvokeAsync();
        }
        protected override async Task OnAfterRenderAsync(bool firstRender)
        {
            if (!firstRender)
            {
                return;
            }
            var parent = await Parent.ToInteropElement();

            var last = await Last.ToInteropElement();

            var observer = new IntersectionObserver(
                new ActionCallback <IntersectionObserverEntry[], IntersectionObserver>(
                    (entries, other) =>
            {
                var intersectedEntries = entries.Where(a => a.isIntersecting);
                foreach (var intersectedEntry in intersectedEntries)
                {
                    Console.WriteLine(intersectedEntry.target.id, intersectedEntry.intersectionRatio);
                    last.innerHTML = intersectedEntry.target.id + " : " + intersectedEntry.intersectionRatio;
                }
                return(Task.CompletedTask);
            }
                    ),
                new IntersectionObserverInitCachedEntity
            {
                root = parent
            }
                );

            for (var i = 1; i <= 100; i++)
            {
                var child = EventHorizonBlazorInterop.FuncClass <Element>(
                    entity => new Element(entity),
                    new string[] { "document", "createElement" },
                    "div"
                    ); // document.createElement('div');
                child.id        = i.ToString();
                child.innerHTML = child.id;
                parent.appendChild(child);

                observer.observe(child);
            }
        }
        private async void OnIntersectUpdate(IList <IntersectionObserverEntry> entries)
        {
            var entry = entries?.FirstOrDefault();

            if (entry == null)
            {
                return;
            }

            await this.IsIntersectingChanged.InvokeAsync(entry.IsIntersecting);

            await this.OnChange.InvokeAsync(entry);

            this.IntersectionObserverContext.Entry = entry;
            this.StateHasChanged();

            if (this.Once && entry.IsIntersecting)
            {
                await this.Observer.Dispose();

                this.Observer = null;
            }
        }
 private async Task InitialiseObserver()
 {
     this.Observer = await this.ObserverService.Observe(this.Element, this.OnIntersectUpdate, this.Options);
 }