Использовать внедренный сервис из кода JS для статического метода Blazor - PullRequest
1 голос
/ 04 октября 2019

У меня есть приложение, которое использует библиотеку jQuery для отображения диалогов «подтверждения».

Когда пользователь нажимает «ОК» или «Отмена» в диалоговом окне, сначала выполняется обратный вызов для моего кода Javascript. Оттуда я вызываю метод Blazor, основываясь на решении, которое принял пользователь.

Все это выглядит примерно так:

Мой код js:

$('.alert-yesno).on('click', function() {
    // For simplicity I immediately call the Blazor method
    DotNet.invokeMethodAsync('[Assembly name]', 'DoSomething')
                            .then(data => {
                                // do something...
                            });
});

Blazor page:

@inject MyService MyService

<button class="alert-yesno">Show dialog</button>

@code
{
    [JSInvokable]
    public static async Task DoSomething()
    {
        // How to use the non static MyService here...?
    }
}

Все это прекрасно работает. Часть Javascript вызывает мой метод Blazor. Но как я могу использовать MyService оттуда? Это вводится в страницу. Это хорошо, потому что он использует внедрение зависимостей.

Я не хочу каждый раз создавать экземпляр new из метода static, потому что таким образом я теряю все автоматически внедренные зависимости.

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 04 октября 2019

См. https://docs.microsoft.com/en-us/aspnet/core/blazor/javascript-interop?view=aspnetcore-3.0#instance-method-call для более полного примера, но вы можете передать ссылку на экземпляр .net в код javascript, вызвав

DotNetObjectReference.Create(myInstance);

Тогда код javascript может вызватьметод экземпляра на этом объекте. Поскольку компонент (и, следовательно, служба, внедренная в него) имеет потенциально другой срок службы, чем обработчик щелчков jquery, это может вызвать некоторые другие проблемы, но ссылка выше должна быть хорошей отправной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...