Javascript 在网站中使用带有信号器原因的原型';hasSubscriptions';这不是一个函数
我有一个运行良好的网站,但当我试图添加一个信号集线器,我得到了错误Javascript 在网站中使用带有信号器原因的原型';hasSubscriptions';这不是一个函数,javascript,signalr,Javascript,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.signa
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)
首先,我不明白为什么这个原型函数会被询问信号订阅
其次,我如何在不删除原型和重写站点中的大量代码的情况下克服这个问题
注:
我尝试为hasSubscriptions
添加一个原型,但这会导致在处理现有原型时出现其他错误
此外,如果原型被移除,信号机周围的所有代码都可以正常工作(但这会破坏站点的其余部分)
实际代码:
<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")
实时数据库是
(function () {
var countersHub = $.connection.countersHub;
$.connection.hub.logging = true;
$.connection.hub.start();
countersHub.client.newCounters = function (counters) {
model.addCounters(counters);
};
....
}());
但是问题是由添加到对象中的任何原型函数(在Helpers.js中定义)引起的,例如
然而,本机javascript原型函数(如toString和hasOwnObject)并非如此
为什么我的原型函数在迭代中被公开,而本地函数却没有公开?有没有办法“屏蔽”我的函数,使它们不以iterand的形式出现?问题是因为我添加到原型中的函数是可枚举的,而底层信号器代码(和jquery)不在我的控制之下。因此,在查找连接上的集线器(
Function.each(jquery-2.1.4.js:382)
)时,它还找到了我添加到原型中的函数
为了解决这个问题,我只需要将原型函数声明为不可枚举,然后它就开始工作了:
Object.defineProperty(Object.prototype, "getFieldValue",{
enumerable:false,
value: function () {
...
}
});
感谢和的回答可能是,但如果没有任何代码,就无法确定。
(function () {
var countersHub = $.connection.countersHub;
$.connection.hub.logging = true;
$.connection.hub.start();
countersHub.client.newCounters = function (counters) {
model.addCounters(counters);
};
....
}());
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;
};
for (i in obj)
Object.defineProperty(Object.prototype, "getFieldValue",{
enumerable:false,
value: function () {
...
}
});