javascript - net - signalr tutorial español
SignalR $.connection no está definido (5)
Lo admito, no sé lo que estoy haciendo.
Estoy intentando aprender a usar SignalR y sigo varias muestras en línea casi textualmente y no puedo pegar $ .connection que no está definido. Estoy trabajando en MVC 4.0 y estoy intentando usar archivos signalR js descargados con nuget o los de proyectos de muestra. Estas son mis referencias de guiones.
@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")
Los scripts parecen cargarse, incluso puse alertas al principio de ellos que se activaron, pero $ .connection no está definida.
En un extraño giro de los eventos, tengo un proyecto diferente en el que estoy tratando de usar una biblioteca jQuery diferente y usa $. y ese objeto es TAMBIÉN siempre indefinido.
Solo estoy buscando una posible explicación de lo que podría estar haciendo mal. Muchas gracias de antemano.
Esto me sucedió porque ~/signalr/hubs
dinámicamente el ~/signalr/hubs
antes de cargar el jquery.signalR-1.1.4.js
.
Al cargar dinámicamente, no hubo ningún error, sin embargo, si tomé la salida de ~/signalr/hubs
y la pegué en mis herramientas de desarrollo de Chrome, recibí un mensaje de error 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
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
He tenido el mismo problema. Para mí, he incluido jquery 2 veces en la página y luego en el diseño. Eliminado uno de ellos solucionado el problema.
Espero eso ayude
La razón por la que esto funciona es debido al orden en que se cargan los archivos javascript. Si intenta cargar jquery.signalR-0.5.1.js antes de cargar jquery, entonces se enfrentará a la $ .connection indefinida porque para esto, el registro de jquery se debe cargar primero. En la plantilla _Layout.cshtml los scripts se cargan en el orden
@Scripts.Render("~/bundles/jquery")
@RenderSection("scripts", required: false)
Así que dentro de cualquiera de sus vistas puede cargar signalr en la sección de script y esto debería funcionar bien.
Resolví el problema. Sé lo que hice pero no sé por qué funcionó seguro.
Estaba haciendo referencia a la biblioteca principal de jquery (versión 1.7.2) en la parte superior de la vista _Layout.cshtml, pero no hacía referencia a ningún otro script de jquery. Noté que por defecto en la vista de diseño se estaba cargando.
@Scripts.Render("~/bundles/jquery")
en la parte inferior de la vista y que una sección de secuencias de comandos se encuentra debajo de eso.
@RenderSection("scripts", required:false)
Cambié aún más mis referencias de guiones como se muestra y coloqué mis referencias de guiones que se muestran en la pregunta anterior
@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")
}
Envoltorio en mi opinión para que se incluyan después de cargar los paquetes. Supongo que no estaba cargando todos los jquery necesarios porque ahora funciona.
Ahora si puedo averiguar cómo se aplica esto a mis otros proyectos.
Tengo el mismo problema hoy.
Su respuesta me indicó la dirección correcta, porque tenía la misma configuración EXACTA para cargar los scripts.
Tenía todas mis etiquetas de script en la parte superior de la página (encabezado) en el siguiente orden.
- JQuery
- Señal r
- / signalr / hubs
- mi-script.js
Y, por supuesto, el @ Layout.cshtml fue muy atento al agregar @Scripts.Render("~/bundles/jquery")
en la parte inferior de la etiqueta <body>
.
Esto es lo que está pasando.
En esta configuración, cuando se carga la página, se cargan todos los scripts en la etiqueta de encabezado, en el orden en que se especifican.
así que carga JQuery, luego SignalR, que configura $.connection
luego el script de hubs generado automáticamente que configura $.connection.hubName
, luego el script personalizado del sitio.
En este punto se ejecuta su código personalizado. PERO su código en algún momento, espera el body.onload
o document.onReady
antes de acceder a $.connection
En el momento en que se dispara este evento, el paquete de scripts que la plantilla de diseño que se agregó al final de la etiqueta del cuerpo también se descarga y ejecuta. Este paquete vuelve a tener la biblioteca jquery ... que restablece toda la configuración de SignalR en $
y ahora su $.connection
ya no está definido.
Cómo resolverlo
Solución fácil, asegúrese de no cargar JQuery dos veces, una vez antes de SignalR y una vez después de SignalR. Moví todos mis scripts para cargarlos después del paquete y solucioné el problema. La mejor práctica aquí es usar la sección de ''scripts'' provista por la plantilla.
@section scripts{
@*/* load your scripts here. You can exclude jQuery,
coz it''s already in the template */ *@
}
Así que esto no es un error de SignalR en absoluto ...
Eso es 2 horas de mi vida ... nunca volveré ...
Espero que esto ayude.