web-dev-qa-db-ja.com

SignalR $ .connectionは未定義です

私はそれを認めます、私は何をしているのかわかりません。

SignalRの使用方法を習得しようとしています。オンラインでさまざまなサンプルをほぼ逐語的にフォローしていますが、貼り付けられた$ .connectionを未定義にすることはできません。私はMVC 4.0で作業していて、nugetでダウンロードされたsignalR jsファイルまたはサンプルプロジェクトのファイルを使用しようとしています。これらは私のスクリプト参照です。

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

スクリプトがロードされているようです-起動時にアラートを表示することさえありますが、$。connectionは常に未定義です。

イベントの奇妙な順番で、別のjQueryライブラリを使用しようとしている$を使用する別のプロジェクトがあります。また、そのオブジェクトも常に未定義です。

私は自分が間違っている可能性のある説明を探しています。よろしくお願いします。

29
Danny Ellis Jr.

今日も同じ問題が発生しました。

私はスクリプトの読み込みについてまったく同じ設定をしていたので、あなたの答えは私を正しい方向に向けました。

すべてのスクリプトタグをページの上部(ヘッド)に次の順序で配置しました。

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

そしてもちろん、@ Layout.cshtmlは、_<body>_タグの下部に@Scripts.Render("~/bundles/jquery")を追加することを考えていました。

これが何が起こっているかです。

この構成では、ページが読み込まれると、指定された順に、headタグ内のすべてのスクリプトが読み込まれます。

したがって、JQueryをロードし、次に_$.connection_をセットアップするSignalR、次に_$.connection.hubName_をセットアップする自動生成ハブスクリプト、次にサイトのカスタムスクリプトをロードします。

この時点で、カスタムコードが実行されます。しかし、ある時点でコードは_body.onload_にアクセスする前に_document.onReady_または_$.connection_を待ちます

このイベントが発生するまでに、レイアウトテンプレートがbodyタグの最後に追加したスクリプトバンドルもダウンロードされ、実行されます。このバンドルには、jqueryライブラリが再びあります。これにより、_$_のSignalRセットアップがすべてリセットされ、_$.connection_が定義されなくなります。

解決方法

簡単な修正です。SignalRの前とSignalRの後でJQueryを2回ロードしないようにしてください。すべてのスクリプトをバンドルの後にロードするように移動し、問題を修正しました。ここでのベストプラクティスは、テンプレートによって提供される「スクリプト」セクションを使用することです。

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

したがって、これはSignalRエラーではありません...

それは私の人生の2時間です...私は二度と戻りません...

お役に立てれば。

56
Madushan

私は問題を解決しました。私は何をしたかは知っていますが、なぜうまくいったのかはわかりません。

_Layout.cshtmlビューの上部にあるメインのjqueryライブラリ(バージョン1.7.2)を参照していましたが、他のjqueryスクリプトを参照していませんでした。レイアウトビューでデフォルトでロードされていることに気付きました

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

ビューの下部にあり、スクリプトセクションはその下にありました。

@RenderSection("scripts", required:false)

スクリプト参照を図のようにさらに変更し、上記の質問に示されているスクリプト参照を

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

バンドルがロードされた後に含まれるように、私のビューのラッパー。今は機能するので、必要なjqueryをすべてロードしていなかったと思います。

これが他のプロジェクトにどのように適用されるかを理解できたら。

10
Danny Ellis Jr.

これが機能する理由は、JavaScriptファイルがロードされる順序が原因です。 jqueryをロードする前にjquery.signalR-0.5.1.jsをロードしようとすると、jqueryを最初にロードする必要があるため、$。connectionが未定義になります。 _Layout.cshtmlテンプレートでは、スクリプトは次の順序でロードされます

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

@RenderSection("scripts", required: false)

したがって、ビュー内でスクリプトセクションの下にシグナルをロードできます。これは正常に機能します。

3
allan

同じ問題がありました。私にとっては、ページにjqueryを2回、後でレイアウトに含めました。それらの1つを削除すると、問題が修正されました。

それが役に立てば幸い

2
cpoDesign

これは、~/signalr/hubsスクリプトをロードする前にjquery.signalR-1.1.4.jsスクリプトを動的にロードしたために起こりました。

動的にロードするときにエラーはありませんでしたが、~/signalr/hubsの出力を取得して自分のchrome dev toolsに貼り付けた場合、エラーメッセージ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