我在Angular中遇到了一个经典问题,当我缩小代码时,由于参数损坏,我得到'未知提供者'。Angular 1.5严格模式注解在看起来不相关的行上发现错误
我读了关于ng-strict-di
指令(我希望我会在几个月前知道的!),以强制执行字符串等效参数。
这有助于我缩小我的问题,因为我现在用我的unminified代码得到这个堆栈跟踪:
所以,问题似乎是在第三方库,我已作了评论的发生错误:
ng.module('opentok', [])
.factory('OT', function() {
return OT;
})
.factory('OTSession', ['OT', '$rootScope',
function(OT, $rootScope) {
var OTSession = {
streams: [],
connections: [],
publishers: [],
init: function(apiKey, sessionId, token, cb) {
this.session = OT.initSession(apiKey, sessionId);
OTSession.session.on({
sessionConnected: function() {
OTSession.publishers.forEach(function(publisher) {
OTSession.session.publish(publisher);
});
},
streamCreated: function(event) {
//ERROR OCCURS ON THE LINE BELOW
$rootScope.$apply(function() {
OTSession.streams.push(event.stream);
});
},
streamDestroyed: function(event) {
$rootScope.$apply(function() {
OTSession.streams.splice(OTSession.streams.indexOf(event.stream), 1);
});
},
sessionDisconnected: function() {
$rootScope.$apply(function() {
OTSession.streams.splice(0, OTSession.streams.length);
OTSession.connections.splice(0, OTSession.connections.length);
});
},
connectionCreated: function(event) {
$rootScope.$apply(function() {
OTSession.connections.push(event.connection);
});
},
connectionDestroyed: function(event) {
$rootScope.$apply(function() {
OTSession.connections.splice(OTSession.connections.indexOf(event.connection), 1);
});
}
});
this.session.connect(token, function(err) {
if (cb) cb(err, OTSession.session);
});
this.trigger('init');
},
addPublisher: function(publisher) {
this.publishers.push(publisher);
this.trigger('otPublisherAdded');
}
};
OT.$.eventing(OTSession);
return OTSession;
}
])
一切似乎都是按顺序排列的,错误发生的行似乎与DI无关。你能发现什么是错的吗?
UPDATE 如果我注释掉行OTSession.streams.push(event.stream);
那么错误就会消失。这似乎很奇怪,因为它所做的只是将对象推送到数组。
我不知道是否是由于opentok库模块,我认为你有注射依赖关系的另一个问题。你可以阅读更多关于:http://stackoverflow.com/a/33494259/861206 但是在你的应用程序的某个地方,你调用了没有使用它们的映射器注入的函数,所以应用程序的函数映射了未定义的错误函数。 像如果我做的: .controller( “FirstController”, [ “$ rootScope”, “$ HTTP”, “$滤波器”,功能($范围,$ HTTP,$滤波器){ } ]) $作用域将是控制器内的应用程序的$ rootScope。 – rbinsztock
谢谢。我意识到,问题在于注入时映射错误或丢失。为了节省我在每个注入依赖关系的地方查看,我读到添加'ng-strict-di'将查明映射不正确的位置。这使得在未缩小的代码中找到错误,但它指向一个工厂,在该工厂中所有依赖关系都已正确映射。真正奇怪的是,如上所述注释掉代码行会导致错误消失。它似乎与DI没有任何关系。 –
不,问题不在发布的第三方代码中。 'OTSession.streams.push(event.stream)'可能会间接影响应用程序的其他部分,但仅此而已。如错误所述,问题在于某个控制器。 – estus