Ссылка на файл JavaScript из другой сборки в проекте Blazor - PullRequest
0 голосов
/ 25 апреля 2020

У меня есть проект библиотеки классов Razor, в который я хочу добавить пару пользовательских компонентов, использующих взаимодействия JavaScript. Интерпросы работают нормально, когда я вызываю функции, которые уже существуют в объекте Window. Это, например, работает нормально:

JSRuntime.InvokeVoidAsync("alert", "Hello world");

Однако, когда нужные мне функции не являются родными для объекта Window, т.е. они объявлены в отдельном файле interops. js, мне нужно добавить <script> тег, ссылающийся на указанный файл на странице HTML. Каков путь к этому файлу, поскольку он находится в другой сборке?

Ответы [ 2 ]

2 голосов
/ 25 апреля 2020

Существует два способа решения этой проблемы.

Расход ресурсов c из ссылочной RCL

Из документации

Файлы, включенные в папку wwwroot в RCL, доступны либо для RCL, либо для приложения-потребителя с префиксом _content / {LIBRARY NAME} /. Например, библиотека с именем Razor.Class.Lib приводит к пути к содержимому stati c в _content / Razor.Class.Lib /. Если при создании пакета NuGet имя сборки не совпадает с идентификатором пакета, используйте идентификатор пакета для {ИМЯ БИБЛИОТЕКИ}.

Чтение содержимого встроенного актива с помощью Reflection

Этот подход позволяет выполнять код Javascript напрямую, без необходимости включать файлы в HTML с <script>.

Сначала создать вспомогательный метод для извлечения встроенного javascript содержимого файла:

public static string GetEmbeddedJSInteropCode(Assembly assembly, string path)
{
    using var stream = assembly.GetManifestResourceStream(path);
    using var reader = new StreamReader(stream);
    return reader.ReadToEnd();
}

Тогда вы можете назвать это так

await JSRuntime.InvokeVoidAsync("eval", GetEmbeddedJSInteropCode(typeof(SomeRCLType).Assembly, "SomeRCL.SomeFolder.Init.js"));
await JSRuntime.InvokeVoidAsync("someRCLFunction", "Foobar");
0 голосов
/ 25 апреля 2020

Когда ссылка на сборку класса Razor указана в проекте веб-сборки Blazor, содержимое папки Razor wwwroot/ копируется в папку Blazor _content/*namespace*/. Таким образом, решение состоит в том, чтобы переместить файл. js в wwwroot/ и ссылаться на него в теге скрипта следующим образом:

<script src="_content/*assembly_name*/file.js"></script>
...