Можно ли установить свойство ElementRef в значение возврата вторжения javascript в Blazor?

asp.net-core blazor c#

Вопрос

Я использую CodeMirror для элемента textarea. Я использую javascript interop для достижения этого, и он отлично работает при применении кода. Однако мое намерение состоит в том, чтобы вернуть этот элемент codemirror и сохранить его в другом элементеref.

Blazor.registerFunction('BlazorExt.CodeMirrorSetupExt', (element) =>
{
    return CodeMirror.fromTextArea(element,
    {
        mode: 'application/ld+json',
        matchBrackets: true,
        autoCloseBrackets: true,
        indentWithTabs: true,
        lineNumbers: true,
        autofocus: true,
        styleActiveLine: true,
        readOnly: false,
        autoCloseBrackets: true,
        foldGutter: true,
        height: 'auto',
        width: 'auto',
        gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter']
    });
});

        public static ElementRef CodeMirrorSetupExt(this ElementRef elementRef)
    {
        var result = RegisteredFunction.Invoke<ElementRef>("BlazorExt.CodeMirrorSetupExt", elementRef);
        return result;
    }

В моем компоненте:

//in my html i have a textarea with ref of TextArea

ElementRef CodeMirror;
ElementRef TextArea;

protected override void OnAfterRender()
{

    CodeMirror = TextArea.CodeMirrorSetupExt();
}

В идеале после этого момента я смогу обновить свой код codemirror ref, используя его такие функции.

    Blazor.registerFunction('BlazorExt.CodeMirrorUpdateExt', (element, Value) =>
{
    element.getDoc().setValue(Value);
});

        public static void CodeMirrorUpdateExt(this ElementRef elementRef, string Value)
    {
        var args = new object[] { elementRef, Value };
        RegisteredFunction.Invoke<object>("BlazorExt.CodeMirrorUpdateExt", args);
    }

В компоненте снова я должен иметь возможность обновлять codemirror следующим образом:

CodeMirror.CodeMirrorUpdateExt("somedata");

Однако я получаю исключение: Microsoft.AspNetCore.Blazor.Browser.Interop.JavaScriptException: Не удается прочитать свойство 'getDoc' из null

Это то, что я пытаюсь выполнить за пределами того, что возможно, или передает javascript-объект codemirror в elementref, который невозможен?

Принятый ответ

Нет, это еще не возможно. Глянь сюда

Что вы можете сделать, зарегистрируйте свой объект javascript глобально и используйте эту ссылку для возможных вторых применений. Вот так:

Blazor.registerFunction('BlazorExt.CodeMirrorSetupExt', (element) =>
{
  window.mybject = CodeMirror.fromTextArea(element,
  {
     mode: 'application/ld+json',
     matchBrackets: true,
     autoCloseBrackets: true,
     indentWithTabs: true,
     lineNumbers: true,
     autofocus: true,
     styleActiveLine: true,
     readOnly: false,
     autoCloseBrackets: true,
     foldGutter: true,
     height: 'auto',
     width: 'auto',
     gutters: ['CodeMirror-linenumbers', 'CodeMirror-foldgutter']
   });
   return true;
 });

public static void CodeMirrorSetupExt(this ElementRef elementRef)
{
    RegisteredFunction.Invoke<bool>("BlazorExt.CodeMirrorSetupExt", elementRef);
}

А потом:

  Blazor.registerFunction('BlazorExt.CodeMirrorUpdateExt', (element, Value)=>{
    window.myObject.getDoc().setValue(Value);
});

Конечно, вы можете сделать это лучше с массивом и ключом в качестве ссылки.




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему