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.
Я просто ищу любое возможное объяснение того, что я могу делать неправильно. Большое спасибо заранее.
Ответы
Ответ 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