درج فایل js در صفحه دلخواه در blazor
استفاده از فایل js در صفحه دلخواه در بلیزور
مثال ساده: فرم تماس با ما
ابتدا، کد کامپوننت فرم تماس با ما را در Blazor تعریف میکنیم:
@page "/contact"
<h3>Contact Us</h3>
<EditForm Model="@contactModel" OnValidSubmit="@HandleValidSubmit">
<DataAnnotationsValidator />
<ValidationSummary />
<div>
<label for="name">Name:</label>
<InputText id="name" @bind-Value="contactModel.Name" />
</div>
<div>
<label for="email">Email:</label>
<InputText id="email" @bind-Value="contactModel.Email" />
</div>
<div>
<label for="message">Message:</label>
<InputTextArea id="message" @bind-Value="contactModel.Message" />
</div>
<button type="submit">Submit</button>
</EditForm>
@code {
private ContactModel contactModel = new ContactModel();
private void HandleValidSubmit()
{
}
public class ContactModel
{
public string Name { get; set; }
public string Email { get; set; }
public string Message { get; set; }
}
}
در این مثال، ما یک فرم ساده برای تماس با ما ایجاد کردهایم که شامل سه فیلد (نام، ایمیل و پیام) است. از EditForm
برای مدیریت فرم و از DataAnnotationsValidator
برای اعتبارسنجی فرم استفاده کردهایم.
مثال پیشرفتهتر: استفاده از Dependency Injection
برای یک مثال پیشرفتهتر، میتوانیم از Dependency Injection برای تزریق یک سرویس به کامپوننت استفاده کنیم. کد زیر یک سرویس ساده برای مدیریت دادهها را نشان میدهد:
@page "/data"
<h3>Data Management</h3>
@if (dataItems == null)
{
<p>Loading...</p>
}
else
{
<ul>
@foreach (var item in dataItems)
{
<li>@item</li>
}
</ul>
}
@code {
[Inject] private IDataService DataService { get; set; }
private List<string> dataItems;
protected override async Task OnInitializedAsync()
{
dataItems = await DataService.GetDataAsync();
}
}
public interface IDataService
{
Task<List<string>> GetDataAsync();
}
public class DataService : IDataService
{
public Task<List<string>> GetDataAsync()
{
return Task.FromResult(new List<string> { "Item 1", "Item 2", "Item 3" });
}
}
در این مثال، ما از IDataService
برای مدیریت دادهها استفاده کردهایم و دادهها را از DataService
با استفاده از Dependency Injection به کامپوننت تزریق کردهایم. همچنین، میتوانیم به بهبود تجربهی کاربری و رندرینگ صفحات با استفاده از ویژگیهای جدید دات نت 9 نگاهی بیندازیم.
مدیریت وضعیت با استفاده از جدیدترین ویژگیها
@page "/state"
<h3>State Management</h3>
<input type="text" @bind="message" />
<p>Message: @message</p>
<button @onclick="SaveMessage">Save</button>
@code {
private string message;
[Inject] private IJSRuntime js { get; set; }
private async Task SaveMessage()
{
await js.InvokeVoidAsync("localStorage.setItem", "message", message);
}
}
این کد یک فیلد ورودی ساده برای ذخیرهسازی پیام در localStorage
با استفاده از جاوااسکریپت را نشان میدهد. اگر بخواهیم این موضوع را به عمق بیشتری بپردازیم، نیاز به ارائه مثالهای بیشتر و توضیحات بیشتری از آنچه در بالا آمده است داریم.
برای این کار در Blazor WebAssembly، میتوانیم از تکنیکهای بارگذاری پویا و نگهداری در حافظهی مرورگر استفاده کنیم. به این روش میتوانیم فقط در صفحهی خاصی که نیاز داریم، فایل JQuery را بارگذاری کنیم و اطمینان حاصل کنیم که تنها یکبار بارگذاری میشود.
گامهای انجام این کار:
ایجاد یک روش جاوااسکریپت برای بارگذاری اسکریپت: یک فایل جاوااسکریپت ایجاد کنید (مثلا scripts.js
) و در آن یک تابع برای بارگذاری اسکریپت اضافه کنید:
function loadScriptOnce(url, callback) {
if (!window.loadedScripts) {
window.loadedScripts = {};
}
if (window.loadedScripts[url]) {
callback();
} else {
var script = document.createElement('script');
script.src = url;
script.onload = function () {
window.loadedScripts[url] = true;
callback();
};
document.head.appendChild(script);
}
}
این تابع بررسی میکند که آیا اسکریپت قبلا بارگذاری شده است یا خیر، و اگر نشده باشد، آن را بارگذاری میکند.
فراخوانی تابع در کامپوننت Blazor: در کامپوننت Blazor، میتوانید از IJSRuntime
برای فراخوانی تابع جاوااسکریپت استفاده کنید. مطمئن شوید که فایل جاوااسکریپت در wwwroot
قرار دارد و در index.html
یا wwwroot/index.html
ارجاع داده شده است.
@page "/page-with-jquery"
<h3>Page with JQuery</h3>
@code {
[Inject] IJSRuntime JS { get; set; }
protected override async Task OnInitializedAsync()
{
await JS.InvokeVoidAsync("loadScriptOnce", "/path/to/jquery.js", DotNetObjectReference.Create(this));
}
[JSInvokable]
public static void ScriptLoadedCallback()
{
}
}
این روش، اطمینان حاصل میکند که فایل JQuery فقط یک بار بارگذاری میشود و در حافظهی مرورگر باقی میماند.
ذخیرهی فایلهای جاوااسکریپت در localStorage
: برای جلوگیری از بارگذاری مجدد اسکریپتها پس از هر بار ریفرش صفحه، میتوانید از localStorage
برای ذخیرهی وضعیت استفاده کنید. این کار را میتوانید با اضافه کردن چند خط کد به تابع loadScriptOnce
انجام دهید:
function loadScriptOnce(url, callback) {
if (!window.loadedScripts) {
window.loadedScripts = {};
}
if (localStorage.getItem(url)) {
callback();
} else {
var script = document.createElement('script');
script.src = url;
script.onload = function () {
window.loadedScripts[url] = true;
localStorage.setItem(url, true);
callback();
};
document.head.appendChild(script);
}
}
با این روشها، میتوانید اطمینان حاصل کنید که فایل JQuery فقط در صفحهی مورد نظر بارگذاری میشود و تنها یکبار در حافظهی مرورگر قرار میگیرد، حتی بعد از ریفرش صفحه.