Не удалось найти свойство окна при выполнении JS-взаимодействия с Blazor - PullRequest
0 голосов
/ 15 января 2019

Здравствуйте, я пытаюсь вызвать метод из файла js из Blazor. Моя файловая структура выглядит так:

-root
  -JSInterop.cs
  -js(folder)
    -meth.js  (file containing the js method)

Я получаю следующую ошибку:

 Could not find 'methods' in 'window'.

** Cs класс, который вызывает JS **

public class JSInterop {
        public static async Task<string> ChangeText() {
            try {
                var data = await JSRuntime.Current.InvokeAsync<string>("./js/meth/methods.print","mymessage");
                Console.WriteLine($"ReturnedFromJS:{data}");
                return data;
            } catch (Exception ex) {

                return ex.Message;
            }

        }
    }

Файл JS

function print(message){
 return "fromJs"+message;
}

window.methods = {
    print: function (message) {
        return "from js" + message;
    }
}

Я пытался как поместить только метод, так и указать его как свойство в window. В первом случае я не уверен, как вы ссылаетесь на метод из файла в js.

 "[path to file]/[containingfile]/[methodname]" ?
  or i have also tried "[path to file] / window.[methodname]"

безрезультатно (во втором случае)

Index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width">
    <title>Sms.Studio.Web</title>
    <base href="/" />
    <link href="css/bootstrap/bootstrap.min.css" rel="stylesheet" />
    <link href="css/site.css" rel="stylesheet" />
</head>
<body>
    <app>Loading...</app>

    <!-- browser -->
    <script src="_framework/blazor.webassembly.js"></script>
    <script src="../interop/js/meth.js"></script>

</body>
</html>

Ответы [ 2 ]

0 голосов
/ 15 января 2019

JSRuntime.Current.InvokeAsync принимает идентификатор функции js относительно глобальной области видимости window в качестве первого аргумента. Таким образом, в вашем файле JS вы можете иметь:

window.methods = {
    print: function (message) {
    return "from js" + message
}

Добавьте файл js в index.html

<script src="css/bootstrap/bootstrap-native.min.js"></script>
<script src="_framework/blazor.webassembly.js"></script>
<script src="js/meth.js"></script>

и вызовите его из .Net следующим образом

await JSRuntime.Current.InvokeAsync<string>("methods.print","mymessage");
0 голосов
/ 15 января 2019
// Try this:
// Don't call your class JSInterop
public class MyJSInterop {
        public static async Task<string> ChangeText() {
            try {
                var data = await JSRuntime.Current.InvokeAsync<string>("methods.print","mymessage");
                Console.WriteLine($"ReturnedFromJS:{data}");
                return data;
            } catch (Exception ex) {

                return ex.Message;
            }

        }
    }

// Js file
window.methods = {
    print: function (message) {
        return "from js" + message;
    }
};
...