BlazorでElementRefプロパティをjavascript interopの戻り値に設定できますか?

asp.net-core blazor c#

質問

私はtextarea要素でCodeMirrorを手直ししています。私はこれを達成するためにjavascript interopを使用しており、コードミラーを適用するとうまく動作します。しかし私の意図は、そのcodemirror要素を返し、別のelementrefに格納することです。

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:nullのプロパティ 'getDoc'を読み取ることができません

可能なこと以外で達成しようとしているか、あるいはcodemirror javascriptオブジェクトをelementrefに渡すことができませんか?

受け入れられた回答

いいえ、これは(まだ)可能ではありません。 ここをクリック

あなたができることは、あなたのjavascriptオブジェクトをグローバルに登録し、その参照を最終的な第2の用途に使用することです。そのようです:

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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ