2017-02-08 3 views
-1

У меня есть сайт, который функционирует нормально, но когда я пытаюсь добавить 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).

Почему мои прототипные функции подвергаются итерации, но нативные их нет, и есть способ «скрыть» мои функции, чтобы они не отображались как итера?

+0

Это, вероятно, [этот вопрос] (HTTP ://переполнение стека.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback), но без какого-либо кода невозможно точно знать. –

ответ

1

Проблема заключалась в том, что функции, которые я добавил в прототип, были перечислимыми, а основной код signalr (и jquery) не под моим контролем. В результате при поиске концентраторов в соединении (Function.each (jquery-2.1.4.js:382)) он также нашел функции, которые я добавил к прототипу.

Чтобы решить эту проблему, я просто необходимо, чтобы объявить функции прототипа не перечислим и все начали работать:

Object.defineProperty(Object.prototype, "getFieldValue",{ 
    enumerable:false, 
    value: function() { 
     ... 
    } 
}); 

благодаря JS non-enumerable function и How to define method in javascript on Array.prototype and Object.prototype so that it doesn't appear in for in loop ответа