Упражнение. Использование библиотеки JavaScript в приложении Blazor
После того как клиент добавляет пиццу в свой заказ, он может выбрать значок X , чтобы удалить пиццу из заказа без подтверждения. Чтобы предотвратить случайное удаление пиццы из заказов клиентов, пиццерия хочет добавить запрос подтверждения на удаление пиццы.
Компания пиццы также хочет, чтобы клиенты могли видеть, как их заказ выполняется в режиме реального времени. Необходимо обновить страницу сведений о заказе, чтобы постоянно запрашивать состояние заказа и предоставлять клиентам отзывы о том, что страница обновляется.
В этом упражнении вы расширяете существующее приложение компании доставки пиццы с помощью взаимодействия JS из компонента Blazor для вызова JavaScript на стороне клиента. Вы интегрируетесь со сторонней библиотекой JavaScript для улучшения всплывающего окна отмены и вызываете метод Blazor из JavaScript, чтобы в режиме реального времени получить состояние заказа клиента.
Клонирование существующего приложения
Чтобы использовать Blazor, убедитесь, что установлен пакет SDK для .NET 8.0 . Дополнительные сведения см. в статье "Создание первого веб-приложения с помощью ASP.NET Core с помощью Blazor".
Откройте Visual Studio Code и откройте интегрированный терминал, выбрав терминал>"Новый терминал " в верхнем меню.
В терминале перейдите в каталог, в котором нужно создать проект.
Выполните следующую команду, чтобы клонировать приложение из GitHub в локальный подкаталог.
git clone https://github.com/MicrosoftDocs/mslearn-build-interactive-components-blazor.git BlazingPizza
В верхней строке меню выберите"Открыть папку">
В диалоговом окне "Открыть папку " перейдите к папке BlazingPizza и выберите "Выбрать папку".
Если Visual Studio Code предложит вам выбрать между отсутствующими ресурсами или неразрешенными зависимостями, выберите Да или Восстановить.
Чтобы запустить приложение и убедиться, что все работает правильно, нажмите клавишу F5 или выберите "Запустить отладку>".
В веб-приложении выберите некоторые пиццы и добавьте их в заказ. Имея несколько пицц в списке заказов, выберите X рядом с одной из пицц и убедитесь, что элемент исчезает без какого-либо предупреждения.
Нажмите клавиши SHIFT+F5 или нажмите кнопку "Остановить>отладку" , чтобы остановить приложение.
Рефакторинг процесса заказа
Чтобы использовать взаимодействие JS, необходимо внедрить абстракцию IJSRuntime
.
В обозревателе Visual Studio Code разверните страницы и выберите Index.razor.
В файле Index.razor после инструкции
@inject OrderState OrderState
добавьте инъекциюIJSRuntime
следующим образом.@inject OrderState OrderState @inject IJSRuntime JavaScript
onclick
В настоящее время событие для функциональных возможностей для удаления пиццы вызываетOrderState.RemoveConfiguredPizza(configuredPizza))
метод напрямую. Замените весь элемент<a @onclick="@(() => OrderState.RemoveConfiguredPizza(configuredPizza))" class="delete-item">❌</a>
следующим кодом:<button type="button" class="close text-danger" aria-label="Close" @onclick="@(async () => await RemovePizzaConfirmation(configuredPizza))"> <span aria-hidden="true">×</span> </button>
В директиве
@code
в конце файла добавьте новый метод для вызова собственной функции JavaScriptconfirm
. Если клиент выбирает ОК из запроса, метод вызываетOrderState.RemoveConfiguredPizza
удаление пиццы из заказа. В противном случае пицца остается в заказе.async Task RemovePizzaConfirmation(Pizza removePizza) { if (await JavaScript.InvokeAsync<bool>( "confirm", $"""Do you want to remove the "{removePizza.Special!.Name}" from your order?""")) { OrderState.RemoveConfiguredPizza(removePizza); } }
Сервер использует метод IJSRuntime.InvokeAsync для вызова функции
confirm
на стороне клиента. Ответ из вызова возвращает значениеbool
. Если результатом диалогового окна подтверждения являетсяtrue
, пицца удаляется из заказа.Нажмите клавишу F5 или выберите "Запустить отладку>".
В приложении добавьте в заказ некоторые пиццы.
Если в вашем заказе несколько пицц, выберите X рядом с одной из пицц. Появится стандартное диалоговое окно подтверждения JavaScript.
Нажмите кнопку "ОК " и убедитесь, что пицца удалена из заказа. Выберите X рядом с другой пиццей, выберите "Отмена " в диалоговом окне подтверждения и убедитесь, что пицца остается в вашем заказе.
Нажмите клавиши SHIFT+F5 или нажмите кнопку "Остановить>отладку" , чтобы остановить приложение.
Добавление сторонней библиотеки JavaScript в приложение Blazor
Компания пиццы хочет более четкого текста на кнопках в диалоговом окне подтверждения и хочет использовать свою фирменную символику и стили в диалоговом окне. После некоторых исследований вы решили использовать небольшую библиотеку JavaScript под названием SweetAlert в качестве хорошей замены стандартного диалога.
В обозревателе Visual Studio Code разверните страницы и выберите _Host.cshtml.
В конце файла _Host.cshtml после строки
<script src="_framework/blazor.server.js"></script>
, но до строки</body>
добавьте следующий элементscript
, чтобы включить библиотеку SweetAlert.<script src="https://cdn.jsdelivr.net/npm/sweetalert@latest/dist/sweetalert.min.js"></script>
Библиотека SweetAlert теперь доступна для вызова на стороне клиента.
Чтобы использовать новую библиотеку, обновите
RemovePizzaConfirmation
метод в файле Index.razor следующим образом.async Task RemovePizzaConfirmation(Pizza removePizza) { var messageParams = new { title = "Remove Pizza?", text = $"""Do you want to remove the "{removePizza.Special!.Name}" from your order?""", icon = "warning", buttons = new { abort = new { text = "No, leave it in my order", value = false }, confirm = new { text = "Yes, remove pizza", value = true } }, dangerMode = true }; if (await JavaScript.InvokeAsync<bool>("swal", messageParams)) { OrderState.RemoveConfiguredPizza(removePizza); } }
Имя
"swal"
— это идентификатор функции JavaScript, которая поступает из третьей сторонней ссылки sweetalert.js. Код для вызова функцииswal
выглядит примерно так, какconfirm
. Большая часть обновления заключается в том, как функция получает параметры. SweetAlert принимает объект JSON, содержащий все необходимые параметры.В Visual Studio Code нажмите клавишу F5 или нажмите кнопку "Запустить отладку>".
Убедитесь, что
confirm
в диалоговом окне теперь есть две кнопки, которые говорят "Нет", оставьте его в моем заказе и да, удалите пиццу и что они работают должным образом.Нажмите клавиши SHIFT+F5 или нажмите кнопку "Остановить>отладку" , чтобы остановить приложение.
Отображение состояния заказа в режиме реального времени на странице заказа
Когда клиент помещает заказ на пиццу, страница "Мои заказы " использует OrderDetail
компонент для отображения текущего состояния заказа. Компания пиццы хочет, чтобы клиенты могли видеть, как их заказ выполняется в режиме реального времени. Вы обновляете компонент, чтобы вызывать метод .NET из JavaScript, который непрерывно получает состояние заказа, пока статус не будет отмечен как доставлено.
В обозревателе Visual Studio Code разверните страницы и выберите OrderDetail.razor.
В файле OrderDetail.razor добавьте следующее объявление в верхней части компонента в соответствии с последней
@inject
инструкцией.@implements IDisposable
Это объявление
@implements
позволяет определить методDispose
.Добавьте спиннер на страницу, чтобы дать клиенту отзыв о том, что страница обновляется. В
<div class="track-order-details">
над инструкцией@foreach
добавьте следующий код:@if (IsOrderIncomplete) { <div class="spinner-grow text-danger float-right" role="status"> <span class="sr-only">Checking your order status...</span> </div> }
В директиве
@code
в объявлении свойстваOrderId
добавьте следующие элементы.bool IsOrderIncomplete => orderWithStatus is null || orderWithStatus.IsDelivered == false; PeriodicTimer timer = new(TimeSpan.FromSeconds(3));
Замените существующий метод
OnParametersSetAsync
следующим кодом:protected override async Task OnParametersSetAsync() => await GetLatestOrderStatusUpdatesAsync();
Теперь код вызывает метод
GetLatestOrderStatusUpdatesAsync
для обновления состояния заказа.Добавьте следующие методы после обновленного метода
OnParametersSetAsync
.protected override Task OnAfterRenderAsync(bool firstRender) => firstRender ? StartPollingTimerAsync() : Task.CompletedTask; async Task GetLatestOrderStatusUpdatesAsync() { try { orderWithStatus = await HttpClient.GetFromJsonAsync<OrderWithStatus>( $"{NavigationManager.BaseUri}orders/{OrderId}"); } catch (Exception ex) { invalidOrder = true; Console.Error.WriteLine(ex); } } async Task StartPollingTimerAsync() { while (IsOrderIncomplete && await timer.WaitForNextTickAsync()) { await GetLatestOrderStatusUpdatesAsync(); StateHasChanged(); } } public void Dispose() => timer.Dispose();
Компонент
OrderDetail
начинает опрос после отрисовки страницы и останавливает опрос при доставке заказа. Хотя состояние заказа является неполным, функцияStartPollingTimerAsync
использует PeriodicTimer для асинхронного ожидания следующего галока. При доставке заказа анимированный спиннер удаляется, а страница отображает окончательное состояние заказа.В Visual Studio Code нажмите клавишу F5 или нажмите кнопку "Запустить отладку>".
В приложении заказать пиццу. Перейдите на экран "Мои заказы" и убедитесь, что анимированная красная точка отображается, пока заказ не завершен и исчезает, когда отображается состояние "Доставлено".
Нажмите клавиши SHIFT+F5 или нажмите кнопку "Остановить>отладку" , чтобы остановить приложение.