私はBlazorをいじり始めたばかりで、この新しいフレームワークの大きな可能性をすでに理解しています。
しかし、入力コントロールにフォーカスを設定するなどの簡単なことをどのように処理するのでしょうか?たとえば、クリックイベントを処理した後、テキスト入力コントロールにフォーカスを設定します。そのようなことのためにJQueryを使用する必要がありますか、それともBlazorにはそのようなことのためのいくつかの組み込みメソッドがありますか?
ありがとう
更新:.NetコードからJavaScript関数を呼び出して、コントロールにフォーカスを設定する方法の例を以下の回答に投稿しました。
現時点(Blazor 0.9.0)では、JavaScript関数をIndex.htmlで作成(またはIndex.htmlから参照)し、BlazorページまたはコンポーネントでJsRuntime.InvokeAsync( "functionName"、parms)を呼び出します。
https://docs.Microsoft.com/en-us/aspnet/core/razor-components/javascript-interop
ボタンをクリックするなどのイベントの後に、JavaScript関数を呼び出してフォーカスを別のコントロールに設定する、より最新の(0.9.0時点の)サンプルを追加したいと思います。これは、Blazorを始めたばかりの人(私のような人)に役立つかもしれません。
この例は、Blazorドキュメント「Build Your First Blazor Components App」のサンプルコード https://docs.Microsoft.com/en-us/aspnet/core/tutorials/build-your-first- razor-components-app?view = aspnetcore-3.
まず、ドキュメントのすべての指示に従ってください。作業中のTo Doリストページがある場合、次を追加します。
<script>
window.MySetFocus = (ctrl) => {
document.getElementById(ctrl).focus();
return true;
}
</script>
@inject IJSRuntime JsRuntime;
async void Focus(string controlId)
{
var obj = JsRuntime.InvokeAsync<string>(
"MySetFocus", controlId);
}
void AddTodo()
{
if (!string.IsNullOrWhiteSpace(newTodo))
{
todos.Add(new TodoItem { Title = newTodo });
newTodo = string.Empty;
Focus("todoItem"); // this is the new code
}
}
Blazorは、javascriptの単なる置き換え(より正確には "値の追加")です。これはクライアント側のみのソリューションです(ただし、将来ASP.Netに簡単にバインドできる可能性があります)。
まだ完全にhtmlとCSSに基づいています。 C#はWebアセンブリを使用してjsパーツを置き換えています。したがって、htmlコントロールへのアクセス方法や変更方法に変更はありません。
現在(バージョン0.1.0)、HTML DOM focus()
Methodを使用して、意図したことを実行する必要があります(はいjavascript現在:()。
// Not tested code
// This is JavaScript.
// Put this inside the index.html. Just below <script type="blazor-boot"></script>
<script>
Blazor.registerFunction('Focus', (controlId) => {
return document.getElementById(controlId).focus();
});
</script>
//and then wrap it for calls from .NET:
// This is C#
public static object Focus(string controlId)
{
return RegisteredFunction.Invoke<object>("Focus", controlId);
//object type is used since Invoke does not have a overload for void methods. Don't know why.
//this will return undifined according to js specs
}
詳細については、以下を参照してください。
jsのパッケージングをきれいに改善したい場合。このようなことができます。 https://stackoverflow.com/a/49521216/476609
public class BlazorExtensionScripts : Microsoft.AspNetCore.Blazor.Components.BlazorComponent
{
protected override void BuildRenderTree(Microsoft.AspNetCore.Blazor.RenderTree.RenderTreeBuilder builder)
{
builder.OpenElement(0, "script");
builder.AddContent(1, "Blazor.registerFunction('Focus', (controlId) => { document.getElementById(controlId).focus(); });");
builder.CloseElement();
}
public static void Focus(string controlId)
{
RegisteredFunction.Invoke<object>("Focus", controlId);
}
}
次に、このコンポーネントをルートに追加します。 (App.cshtml)
<BlazorExtensionScripts></BlazorExtensionScripts>
<Router AppAssembly=typeof(Program).Assembly />
JavaScript関数を直接呼び出すことはできません。次のような関数を最初に登録する必要があります。
<script>
Blazor.registerFunction('ShowControl', (item) => {
var txtInput = document.getElementById("txtValue");
txtInput.style.display = "";
txtInput.value = item;
txtInput.focus();
});
return true;
</script>
次に、このJavaScript関数を呼び出すメソッドをC#で宣言する必要があります。お気に入り、
private void CallJavaScript()
{
RegisteredFunction.Invoke<bool>("ShowControl", itemName);
}
ボタンをクリックすると、このC#メソッドを呼び出すことができます。お気に入り、
<button id="btnShow" class="btn btn-primary" @onclick(CallJavaScript)>Show</button>
この投稿 BlazorとASP.NET Coreを使用してCRUDアプリを作成する は、BlazorからJavaScriptを呼び出す実際のデモを示しています。