web-dev-qa-db-fra.com

SignalR $ .connection n'est pas défini

Je l'avoue, je ne sais pas ce que je fais.

J'essaie d'apprendre à utiliser SignalR et je suis en train de suivre divers exemples en ligne presque textuellement et je ne peux pas coller $ .connection étant indéfini. Je travaille dans MVC 4.0 et j'essaie d'utiliser des fichiers signalR js téléchargés par nuget ou ceux de projets exemples. Ce sont mes références de script.

@Scripts.Render("~/Scripts/jquery-1.7.2.min.js")
@Scripts.Render("~/Scripts/knockout-2.0.0.js")
@Scripts.Render("~/Scripts/jquery.signalR.js")
@Scripts.Render("~/signalr/hubs")

Les scripts semblent se charger - j'ai même mis au début des alertes qui se déclenchent, mais $ .connection n'est toujours pas défini.

Dans une tournure bizarre des événements, j'ai un projet différent où j'essaie d'utiliser une bibliothèque jQuery différente et elle utilise $. et cet objet est AUSSI toujours indéfini.

Je cherche juste une explication possible de ce que je pourrais faire de mal. Merci d'avance.

29
Danny Ellis Jr.

J'ai le même problème aujourd'hui.

Votre réponse m'a orienté dans la bonne direction, car j'avais exactement la même configuration pour le chargement du script.

J'avais toutes mes balises de script en haut de la page (tête) dans l'ordre suivant.

  • JQuery
  • SignalR
  • / signalr/hubs
  • my-script.js

Et bien sûr, le @ Layout.cshtml était tellement réfléchi pour ajouter @Scripts.Render("~/bundles/jquery") au bas du <body> tag.

Voici ce qui se passe.

Dans cette configuration, lorsque la page se charge, elle charge tous les scripts de la balise head, dans l'ordre où ils sont spécifiés.

il charge donc JQuery, puis SignalR, qui configure $.connection puis le script de hubs généré automatiquement qui configure le $.connection.hubName, puis le script personnalisé du site.

À ce stade, votre code personnalisé s'exécute. MAIS votre code à un moment donné, attend le body.onload ou document.onReady avant d'accéder à $.connection

Au moment où cet événement se déclenche, l'ensemble de scripts que le modèle de mise en page a ajouté pour vous à la fin de la balise body est également téléchargé et exécuté. Ce bundle contient à nouveau la bibliothèque jquery .... qui réinitialise tout le paramétrage de SignalR sur $ et maintenant votre $.connection n'est plus défini.

Comment le résoudre

Solution facile, assurez-vous de ne pas charger JQuery deux fois, une fois avant SignalR et une fois après SignalR. J'ai déplacé tous mes scripts à charger après le bundle et cela a résolu le problème. La meilleure pratique consiste à utiliser la section "scripts" fournie par le modèle.

@section scripts{
    @*/* load your scripts here. You can exclude jQuery, 
      coz it's already in the template */ *@
}

Ce n'est donc pas du tout une erreur SignalR ...

Ça fait 2 heures de ma vie ... je ne reviendrai jamais ...

J'espère que cela t'aides.

56
Madushan

J'ai résolu le problème. Je sais ce que j'ai fait mais je ne sais pas pourquoi cela a fonctionné à coup sûr.

Je faisais référence à la bibliothèque jquery principale (version 1.7.2) en haut de la vue _Layout.cshtml, mais je ne faisais référence à aucun autre script jquery. J'ai remarqué que par défaut dans la vue de mise en page, il se chargeait

@Scripts.Render("~/bundles/jquery") 

en bas de la vue et qu'une section de scripts se trouvait en dessous.

@RenderSection("scripts", required:false)

J'ai encore modifié mes références de script comme indiqué et mis mes références de script indiquées dans la question ci-dessus dans un

@section scripts
{    
   @Scripts.Render("~/Scripts/jquery.signalR-0.5.1.js")
   @Scripts.Render("~/Scripts/jquery.color.js")
   @Scripts.Render("~/signalr/hubs")
   @Scripts.Render("~/Scripts/blasht.signalr.js")
}

wrapper sur mon point de vue afin qu'ils soient inclus après le chargement des faisceaux. Je suppose que je ne chargeais pas tous les jquery nécessaires car maintenant cela fonctionne.

Maintenant, si je peux comprendre comment cela s'applique à mes autres projets.

10
Danny Ellis Jr.

La raison pour laquelle cela fonctionne est dû à l'ordre dans lequel les fichiers javascript sont chargés. Si vous essayez de charger jquery.signalR-0.5.1.js avant de charger jquery, vous serez confronté à la $ .connection indéfinie car pour cela à enregistrer, jquery doit être chargé en premier. Dans le modèle _Layout.cshtml, les scripts se chargent dans l'ordre

@Scripts.Render("~/bundles/jquery")

@RenderSection("scripts", required: false)

Donc, dans n'importe laquelle de vos vues, vous pouvez charger signalr dans la section script et cela devrait fonctionner correctement.

3
allan

J'ai eu le même problème. pour moi, j'ai inclus jquery 2 fois dans la page et plus tard dans la mise en page. Supprimé l'un d'eux a résolu le problème.

J'espère que ça aide

2
cpoDesign

Cela m'est arrivé parce que j'ai chargé dynamiquement le ~/signalr/hubs script avant de charger le jquery.signalR-1.1.4.js script.

Lors du chargement dynamique, aucune erreur n'était présente, cependant si je prenais la sortie de ~/signalr/hubs et l'ai collé dans mes chrome, j'ai reçu un message d'erreur VM1047:18 Uncaught Error: SignalR: SignalR is not loaded. Please ensure jquery.signalR-x.js is referenced before ~/signalr/hubs. at <anonymous>:18:15 at <anonymous>:300:2

0
Zeb Rawnsley