feat: 框架搭建基本完成
geffzhang authored at 2023-02-28 20:06:05
1.53 KiB
NewLife.CubeBlazor
using Microsoft.Extensions.DependencyInjection;
using Microsoft.JSInterop;

namespace NewLife.CubeBlazor.Razor.JsInterop;

public class JsDotNetInvoker : IDisposable, IScopedDependency
{
    private readonly IJSRuntime _jsRuntime;
    private readonly List<DotNetObjectReference<Invoker>> _references = new();

    public JsDotNetInvoker(IJSRuntime jsRuntime)
    {
        _jsRuntime = jsRuntime;
    }

    public async Task ResizeObserver(string selector, Func<Task> func)
    {
        var invoker = DotNetObjectReference.Create(new Invoker(func));

        _references.Add(invoker);

        await _jsRuntime.InvokeVoidAsync(
            "MasaStackComponents.resizeObserver",
            selector,
            invoker
        );
    }

    public async Task IntersectionObserver(string selector, Func<Task> func)
    {
        var invoker = DotNetObjectReference.Create(new Invoker(func));

        _references.Add(invoker);

        await _jsRuntime.InvokeVoidAsync(
            "MasaStackComponents.intersectionObserver",
            selector,
            invoker);
    }

    public void Dispose()
    {
        foreach (var reference in _references)
        {
            reference.Dispose();
        }
    }

    private class Invoker
    {
        private readonly Func<Task>? _func;

        public Invoker(Func<Task> func)
        {
            _func = func;
        }

        [JSInvokable]
        public async Task Invoke()
        {
            if (_func is not null)
            {
                await _func.Invoke();
            }
        }
    }
}