Bonjour, j'essaie d'appeler une méthode à partir d'un fichier js
de Blazor
.
Ma structure de fichier est comme ceci:
<!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>
J'obtiens toujours l'erreur suivante:
"[path to file]/[containingfile]/[methodname]" ? or i have also tried "[path to file] / window.[methodname]"
** Classe Cs qui appelle le js **
function print(message){ return "fromJs"+message; } window.methods = { print: function (message) { return "from js" + message; } }
Fichier 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; } } }
J'ai essayé à la fois de mettre simplement la méthode et de la mettre en tant que propriété dans la fenêtre
.Je ne sais pas dans le premier cas comment faire référence à une méthode à partir d'un fichier dans js.
Could not find 'methods' in 'window'.
à aucun résultat (dans le second cas)
Index.html
-root -JSInterop.cs -js(folder) -meth.js (file containing the js method)
3 Réponses :
// 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; } };
J'ai d'abord essayé d'utiliser le JSRuntime.Current.InvokeAsync
directement dans mon fichier cshtml
et cette erreur avec window
est apparue.Lorsque je délègue le < code> JS appelle une autre classe comme vous l'avez fait ici MyJSInterop
J'obtiens une erreur de console Uncaught SyntaxError: Uncaught token <
dans le fichier js.
Un point-virgule manquait dans l'instruction de retour JavaScript, ce qui peut entraîner une erreur de syntaxe ...
Vous avez également besoin d'un point-virgule comme celui-ci: window.methods = {} ***; ***
Je ne comprends pas. J'ai placé un point-virgule à la fois après le return
et j'ai également essayé après la déclaration window ..... = ...;
. cette erreur.
JSRuntime.Current.InvokeAsync prend un identifiant de fonction js par rapport à la portée globale window comme premier argument. Donc, dans votre fichier js, vous pouvez avoir:
await JSRuntime.Current.InvokeAsync<string>("methods.print","mymessage");
Ajoutez votre fichier js dans index.html
<script src="css/bootstrap/bootstrap-native.min.js"></script> <script src="_framework/blazor.webassembly.js"></script> <script src="js/meth.js"></script>
et appelez-le depuis .Net comme suit
window.methods = { print: function (message) { return "from js" + message }
J'ai mis à jour ma réponse, j'ai déjà ajouté le chemin dans le index.html
aidé par le Intellisense
.
Voici un exemple de bout en bout d'écriture de cookie.
étape 1 - Ajoutez MatButton
et définissez l'attribut onClick
sur delegate
.
<script> window.blazorExtensions = { WriteCookie: function (name, value, days) { var expires; if (days) { var date = new Date(); date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toGMTString(); } else { expires = ""; } document.cookie = name + "=" + value + expires + "; path=/"; } } </script>
Étape 2
@code{ public async Task AddItemtoShoppingCart(FoodItem selectedItem) { var test = await JSRuntime.InvokeAsync<object>("blazorExtensions.WriteCookie", "cookieName", "cookieValue", "cookieExpiryDate"); } }
Étape 3 - Ajoutez ci-dessous javasceipt dans _Host.cshtml
<MatButton TrailingIcon="favorite" @onclick="@(async () => await AddItemtoShoppingCart(@item))" Label="add"></MatButton>