2012-06-26 6 views
20

Ich gebe es zu, ich weiß nicht, was ich mache.

Ich versuche zu lernen, SignalR zu verwenden, und ich verfolge verschiedene Proben online fast wörtlich und ich kann nicht eingefügt $ .connection undefined werden. Ich arbeite in MVC 4.0 und versuche, nugget-downloaded signalR js-Dateien oder solche aus Beispielprojekten zu verwenden. Dies sind meine Skriptverweise.

@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") 

Die Skripte scheinen zu laden - ich habe sogar Warnungen setzen zu Beginn von ihnen das Feuer, aber .connection $ ist immer undefiniert.

In einer bizarren Wendung der Ereignisse, habe ich ein anderes Projekt, wo ich versuche, eine andere jQuery-Bibliothek zu verwenden und $ verwendet. und dieses Objekt ist AUCH immer undefiniert.

Ich bin nur auf der Suche nach einer möglichen Erklärung dessen, was ich falsch machen könnte. Vielen Dank im Voraus.

+0

Wie können wir ohne die geringste Spur helfen, soll der Code? – Cranio

+3

Haben Sie jQuery zweimal auf der Seite enthalten? – davidfowl

Antwort

8

Ich löste das Problem. Ich weiß, was ich getan habe, aber ich weiß nicht, warum es so funktioniert hat.

Ich verweise auf die Hauptjquery-Bibliothek (Version 1.7.2) oben in der _Layout.cshtml-Ansicht, referenzierte jedoch keine anderen Jquery-Skripts. Ich bemerkte, dass im Layout von Standardansicht wurde

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

am unteren Rande der Ansicht geladen und dass ein Abschnitt Skripts wurde unter dem liegt.

@RenderSection("scripts", required:false) 

ich meine Skript Referenzen weiter geändert, wie und meine Skript Referenzen in der Frage oben in einem auf meiner Ansicht

gezeigt setzen gezeigt
@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, so dass sie nach dem das Bündel geladen wurde einbezogen würden. Ich nehme an, dass ich nicht alle notwendigen jquery geladen habe, weil es jetzt funktioniert.

Jetzt wenn ich herausfinden kann, wie das für meine anderen Projekte gilt.

3

Der Grund dafür ist die Reihenfolge, in der die Javascript-Dateien geladen sind. Wenn Sie versuchen, jquery.signalR-0.5.1.js vor dem Laden von jquery zu laden, werden Sie mit der $ .connection undefined konfrontiert, da die jquery zuerst geladen werden sollte, um dies zu registrieren. In der _Layout.cshtml Vorlage laden die Skripte in der Reihenfolge

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

@RenderSection("scripts", required: false) 

So innerhalb eines Ihrer Ansichten können Sie signalr unter dem Skriptabschnitt geladen werden, und dies sollte gut funktionieren.

44

Ich habe das gleiche Problem heute.

Ihre Antwort zeigte mir in die richtige Richtung, denn ich hatte das gleiche Setup für das Laden von Skripten.

Ich hatte alle meine Skript-Tags auf der Oberseite der Seite (Kopf) in der folgenden Reihenfolge.

  • JQuery
  • SignalR
  • /signalr/Naben
  • my-Skript.js

Und natürlich war das @ Layout.cshtml so nachdenklich @Scripts.Render("~/bundles/jquery") am unteren Rand des <body> Tag hinzuzufügen.

Hier ist was passiert.

Wenn in dieser Konfiguration die Seite geladen wird, werden alle Skripts im head-Tag in der angegebenen Reihenfolge geladen.

so lädt es JQuery, dann SignalR, die $.connection dann die automatisch generierte Hubs-Skript, die die , dann die Website benutzerdefinierte Skript eingerichtet.

An diesem Punkt wird Ihr benutzerdefinierter Code ausgeführt. Aber Ihr Code an einem gewissen Punkt, wartet auf die body.onload oder document.onReady vor dem $.connection

Zu der Zeit, dieses Ereignis ausgelöst wird Zugriff auf das Skript Bündel, das die Layoutvorlage für Sie am Ende des Body-Tag hinzugefügt auch Downloads und führt. Dieses Bundle hat wieder die jquery-Bibliothek .... welche alles SignalR setup auf $ zurücksetzt und nun Ihre $.connection nicht mehr definiert.

Wie es

Einfache Lösung zu lösen, stellen Sie sicher, dass Sie JQuery nicht geladen werden zweimal, einmal vor und einmal nach SignalR SignalR. Ich habe alle meine Skripte verschoben, um nach dem Paket zu laden, und das Problem wurde behoben. Es empfiehlt sich, den Abschnitt "scripts" zu verwenden, der von der Vorlage bereitgestellt wird.

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

So ist dies überhaupt kein SignalR Fehler ...

, dass 2 Stunden meines Lebens ... Ich werde nie, das hilft

Hoffnung zurück ... bekommen.

+1

Super, danke. Funktioniert immer noch nicht, aber es bringt mich näher (kein Fehler mehr in der Konsole)! – user1477388

+1

Oh Gott ..... danke für die Antwort :) – Dzhambazov

+0

du rock man ... !! es funktionierte und speicherte diese kostbaren "2 Stunden anderer Entwickler mit demselben Problem":) – Kings

2

Ich hatte dasselbe Problem. für mich habe ich jquery 2 mal in der Seite und später im Layout enthalten. Einer der Fehler wurde behoben.

Hoffe, es hilft

0

Das ist mir passiert, weil ich dynamisch die ~/signalr/hubs Skript geladen, bevor das jquery.signalR-1.1.4.js Skript geladen werden.

Wenn dynamisch geladen, kein Fehler vorhanden war, aber wenn ich die Ausgabe von ~/signalr/hubs nahm und klebte es in meine Chrom Entwickler-Tools, erhielt ich eine Fehlermeldung 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