У меня есть сайт, который функционирует нормально, но когда я пытаюсь добавить signalr ступицу к ней я получаю ошибкуиспользуя прототипы веб-сайта с «hasSubscriptions» signalr вызывает не функция
Uncaught TypeError: this.hasSubscriptions is not a function
at Function.<anonymous> (jquery.signalR-2.2.0.js:2878)
at Function.each (jquery-2.1.4.js:382)
at hubConnection.fn.init.<anonymous> (jquery.signalR-2.2.0.js:2877)
at hubConnection.fn.init.<anonymous> (jquery.signalR-2.2.0.js:759)
at hubConnection.fn.init.dispatch (jquery-2.1.4.js:4435)
at hubConnection.fn.init.elemData.handle (jquery-2.1.4.js:4121)
at Object.trigger (jquery-2.1.4.js:4350)
at jQuery.fn.init.triggerHandler (jquery-2.1.4.js:4907)
at hubConnection.fn.init.start (jquery.signalR-2.2.0.js:652)
at connection._.deferredStartHandler (jquery.signalR-2.2.0.js:463)
опрашивающего линии 2878 в библиотеке signalr приводит меня найти, что this
прототип я определил в другом сценарии
Object.prototype.myfunction = function(){
...
}
во-первых, я не могу понять, почему этот прототип функции допрашивают для подписки signalr.
И, во-вторых, как мне пройти эту проблему, не удаляя прототип и переписывая фрагменты кода на сайте?
Примечание:
Я попытался добавить прототип hasSubscriptions
, но это приводит к другим ошибкам по обработке моих существующих прототипов
Кроме того, весь код вокруг signalr отлично работает, если прототипы будут удалены (но это ломает остальной части сайта)
Фактический код:
<div ng-show="noPartialView()" class="well well-lg">
<div class="row" data-bind="foreach:counters">
<div class="col-md-12 canvas-container">
<h2 data-bind="text:name" class="graph-header"></h2>
<div data-bind="foreach:lines">
<div class="indicatorLine inline" data-bind="style:{borderColor:color}"><img /></div>
<span data-bind="text:name"></span>
</div>
<canvas width="1700" height="200" data-bind="attr:{'id': name}" class="responsive-canvas"></canvas>
</div>
</div>
</div>
@Scripts.Render("~/bundles/jquery")
<script src="~/SignalR/hubs"></script>
@Scripts.Render("~/bundles/angular")
@Scripts.Render("~/bundles/realtimedata")
@Scripts.Render("~/bundles/AngularMVCApp")
где пучки являются:
bundles.Add(new ScriptBundle("~/bundles/jquery")
.Include("~/Scripts/jquery-2.1.4.js")
.Include("~/Scripts/jquery.signalR-2.2.0.js")
.Include("~/Scripts/jquery.color-2.1.2.js"));
bundles.Add(new ScriptBundle("~/bundles/angular")
.Include("~/Scripts/angular.js")
.Include("~/Scripts/angular-sanitize.js")
.Include("~/Scripts/angular-bootstrap-confirm.js")
.Include("~/Scripts/angular-animate.js")
.Include("~/Scripts/angular-ui/ui-bootstrap-tpls.js")
.Include("~/Scripts/angular-route.js")
.Include("~/Scripts/datetime-picker.js")
.Include("~/Scripts/angular-locale_en-gb.js")
.Include("~/Scripts/moment-with-locales.js"));
bundles.Add(new ScriptBundle("~/bundles/bootstrap")
.Include("~/Scripts/bootstrap.js"));
bundles.Add(new ScriptBundle("~/bundles/realtimedata")
.Include("~/Scripts/knockout-2.3.0.js")
.Include("~/Scripts/smoothie.js")
.Include("~/Scripts/realtimedata.js"));
bundles.Add(new ScriptBundle("~/bundles/AngularMVCApp")
.Include("~/Scripts/Helpers.js")
.Include("~/Scripts/InFill.js")
.Include("~/Scripts/ArrayComparer.js")
.IncludeDirectory("~/Scripts/Providers", "*.js")
.IncludeDirectory("~/Scripts/Directives", "*.js")
.IncludeDirectory("~/Scripts/Services", "*.js")
.IncludeDirectory("~/Scripts/Controllers", "*.js")
.Include("~/Scripts/AngularMVCApp.js"));
и RealTimeData библиотека
(function() {
var countersHub = $.connection.countersHub;
$.connection.hub.logging = true;
$.connection.hub.start();
countersHub.client.newCounters = function (counters) {
model.addCounters(counters);
};
....
}());
но проблемы вызваны любыми функциями прототипа, добавленных к объекту (которые определены в Helpers.js), например,
Object.prototype.getFieldValue = function() {
if (arguments == null || arguments.length != 1) {
return null;
}
var fieldName = arguments[0];
if (this == null || fieldName == null || typeof fieldName != 'string') {
return null;
}
var temp = this;
var fieldNameSplit = fieldName.split('.');
for (i = 0; i < fieldNameSplit.length; i++) {
if (temp == null) {
return temp;
}
if (fieldNameSplit[i].indexOf('[') > -1) {
var fieldNameWithoutIndex = fieldNameSplit[i].split('[')[0];
var index = fieldNameSplit[i].split('[')[1].split(']')[0];
temp = temp[fieldNameWithoutIndex][index];
}
else {
temp = temp[fieldNameSplit[i]];
}
}
return temp;
};
Edit: Дополнительная информация найдено
проблема выглядит быть вызвана функциями объекта прототипа, подвергавшихся влиянию в итерационном
for (i in obj)
еще родной Javascript функции прототипа (например, toString и hasOwnObject).
Почему мои прототипные функции подвергаются итерации, но нативные их нет, и есть способ «скрыть» мои функции, чтобы они не отображались как итера?
Это, вероятно, [этот вопрос] (HTTP ://переполнение стека.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback), но без какого-либо кода невозможно точно знать. –