Подтвердить что ты не робот

SignalR $.соединение undefined

Я признаю это, я не знаю, что я делаю.

Я пытаюсь узнать, как использовать SignalR, и я следую различным примерам онлайн почти дословно, и я не могу вставить $.connection undefined. Я работаю в MVC 4.0 и пытаюсь использовать файлы jR, загруженные nuget файлами, или файлы из примеров. Это мои ссылки 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")

Сценарии, похоже, загружаются - я даже поставил предупреждения в начале, которые запускают огонь, но $.connection всегда undefined.

В странном повороте событий у меня есть другой проект, в котором я пытаюсь использовать другую библиотеку jQuery, и она использует $. и этот объект всегда ТАКЖЕ undefined.

Я просто ищу любое возможное объяснение того, что я могу делать неправильно. Большое спасибо заранее.

4b9b3361

Ответ 1

Сегодня у меня такая же проблема.

Ваш ответ указал мне в правильном направлении, потому что у меня была ТОЧНАЯ настройка для загрузки script.

У меня были все теги script в верхней части страницы (главы) в следующем порядке.

  • JQuery
  • SignalR signalr/концентраторы
  • my- script.js

И, конечно, @Layout.cshtml настолько задумался, чтобы добавить @Scripts.Render("~/bundles/jquery") в конец тега <body>.

Вот что происходит.

В этой конфигурации, когда страница загружается, она загружает все скрипты в теге head в том порядке, в котором они указаны.

поэтому он загружает JQuery, а затем SignalR, который устанавливает $.connection, затем автоматически сгенерированные хабы script, который устанавливает $.connection.hubName, а затем пользовательский пользовательский script.

В этот момент выполняется ваш пользовательский код. НО ваш код в какой-то момент ждет body.onload или document.onReady, прежде чем обращаться к $.connection

К моменту запуска этого события пакет script, который шаблон шаблона, добавленный для вас в конце тега body, также загружается и выполняется. В этом пакете снова есть библиотека jquery.... которая сбрасывает все настройки SignalR на $, и теперь ваш $.connection больше не определен.

Как решить его

Простое исправление, убедитесь, что вы не загружаете JQuery дважды, один раз перед SignalR и один раз после SignalR. Я переместил все мои скрипты для загрузки после пакета и исправил проблему. Лучшей практикой здесь является использование раздела "скрипты", предоставляемого шаблоном.

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

Так что это вовсе не ошибка SignalR...

Это 2 часа моей жизни... Я никогда не вернусь...

Надеюсь, что это поможет.

Ответ 2

Я решил проблему. Я знаю, что я сделал, но я не знаю, почему это сработало.

Я ссылался на основную библиотеку jquery (версия 1.7.2) в верхней части представления _Layout.cshtml, но не ссылался на другие скрипты jquery. Я заметил, что по умолчанию в макете было загружено

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

в нижней части представления и что раздел сценариев находится ниже этого.

@RenderSection("scripts", required:false)

Я также изменил свои ссылки script, как показано, и поместил ссылки script, указанные в вопросе выше, в

@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, потому что теперь он работает.

Теперь, если я могу понять, как это относится к моим другим проектам.

Ответ 3

Причина, по которой это работает, - это порядок, в котором загружаются файлы javascript. Если вы попытаетесь загрузить jquery.signalR-0.5.1.js перед загрузкой jquery, вы столкнетесь с $.connection undefined, потому что для этого для регистрации jquery нужно сначала загрузить. В шаблоне _Layout.cshtml загрузка скриптов выполняется в порядке

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

@RenderSection("scripts", required: false)

Таким образом, внутри любого из ваших представлений вы можете загрузить signalr в разделе script, и это должно работать нормально.

Ответ 4

У меня была такая же проблема. для меня я включил jquery 2 раза в страницу, а затем в макет. Удаленный из них исправил проблему.

Надеюсь, что это поможет

Ответ 5

Это произошло со мной, потому что я динамически загрузил ~/signalr/hubs script перед загрузкой jquery.signalR-1.1.4.js script.

При динамической загрузке никакой ошибки не было, однако, если я взял вывод ~/signalr/hubs и вставил ее в свои инструменты chrome dev, я получил сообщение об ошибке 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