32

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

私は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 ライブラリを使用しようとしていて、$ を使用しています。また、そのオブジェクトは常に未定義です。

私が間違っている可能性のあることについて、考えられる説明を探しているだけです。よろしくお願いします。

4

5 に答える 5

67

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

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

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

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

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

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

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

そのため、JQuery、SignalRの順に読み込まれ、次に$.connection自動生成されたハブスクリプトが読み込まれ$.connection.hubName、次にサイトのカスタムスクリプトが読み込まれます。

この時点で、カスタムコードが実行されます。しかし、ある時点でコードは、body.onloadまたはdocument.onReadyにアクセスする前に待機します。$.connection

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

それを解決する方法

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

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

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

それは私の人生の2時間です...私は二度と戻らないでしょう...

お役に立てれば。

于 2013-02-19T09:52:13.163 に答える
10

問題を解決しました。私は自分が何をしたかを知っていますが、なぜそれが確実に機能したのかわかりません。

_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をロードしていなかったと思います。

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

于 2012-06-26T16:01:03.423 に答える
3

これが機能する理由は、JavaScript ファイルがロードされる順序のためです。jquery をロードする前に jquery.signalR-0.5.1.js をロードしようとすると、$.connection undefined が発生します。これを登録するには、jquery を最初にロードする必要があるためです。_Layout.cshtml テンプレートでは、スクリプトは順番に読み込まれます

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

@RenderSection("scripts", required: false)

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

于 2012-07-28T17:52:29.767 に答える
2

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

それが役に立てば幸い

于 2013-08-19T08:31:45.920 に答える