using Microsoft.AspNetCore.Components; using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace BlazorAceEditor { public partial class AceEditor : IAsyncDisposable { [Inject] private AceEditorJsInterop JsInterop { get; set; } /// /// 附加属性 /// [Parameter(CaptureUnmatchedValues = true)] public Dictionary Attributes { get; set; } [Parameter] public EventCallback OnChanged { get; set; } [Parameter] public EventCallback OnLoad { get; set; } public string ElementId { get; } = $"BlazorAceEditor_{Guid.NewGuid():N}"; protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); } protected override async Task OnAfterRenderAsync(bool firstRender) { await base.OnAfterRenderAsync(firstRender); if (firstRender) { AceEditorJsCallbackManager.AddEventHandler(ElementId, "onChange", new Func(() => OnChanged.InvokeAsync(this))); AceEditorJsCallbackManager.AddEventHandler(ElementId, "onLoad", new Func(() => OnLoad.InvokeAsync(this))); await CreateEditor(); } } public async ValueTask DisposeAsync() { AceEditorJsCallbackManager.DisposeObject(ElementId); await DestroyEditor(); } //glues base private Task InvokeVoid([CallerMemberName] string methodName = null) => JsInterop.InvokeVoid(ElementId, methodName); private Task InvokeVoidP1(object arg0, [CallerMemberName] string methodName = null) => JsInterop.InvokeVoidP1(ElementId, arg0, methodName); private ValueTask Invoke([CallerMemberName] string methodName = null) => JsInterop.Invoke(ElementId, methodName); //glues private Task CreateEditor() => InvokeVoid(); private Task DestroyEditor() => InvokeVoid(); public Task SetTheme(string themeName) => InvokeVoidP1(themeName); public Task SetLang(string langName) => InvokeVoidP1(langName); public Task SetInfinityMaxLines() => InvokeVoid(); public Task SetMaxLines(int maxLines) => InvokeVoidP1(maxLines); public Task SetMinLines(int minLines) => InvokeVoidP1(minLines); public ValueTask GetValue() => Invoke(); public Task SetValue(string value) => InvokeVoidP1(value); public Task SetFontSize(int value) => InvokeVoidP1(value); public Task ClearSelection() => InvokeVoid(); } }