【发布时间】:2017-03-15 10:34:13
【问题描述】:
我在 Angular 中遇到了一个经典问题,当我缩小代码时,由于参数修改,我得到了“未知提供者”。
我读到了 ng-strict-di 指令(我希望我在几个月前就知道它!)强制字符串等价物与参数一起传递。
这帮助我缩小了我的问题范围,因为我现在使用我未缩小的代码获取此堆栈跟踪:
所以问题似乎出在第三方库中,我已经评论了错误发生的位置:
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 无关。你能看出哪里不对吗?
更新
如果我注释掉 OTSession.streams.push(event.stream); 行,那么错误就会消失。这看起来很奇怪,因为它所做的只是将一个对象推送到一个数组中。
【问题讨论】:
-
不知道是不是opentok库模块的原因,我觉得你还有注入依赖的问题。你可以阅读更多关于:stackoverflow.com/a/33494259/861206 但是在你的应用程序的某个地方你调用了没有注入映射器的函数,所以应用程序的函数映射了未定义的错误函数。就像我这样做: .controller("FirstController", ["$rootScope", "$http", "$filter", function ($scope, $http, $filter) { } ]) $scope 将是 $rootScope您在控制器中的应用程序。
-
谢谢。我知道问题在于注入时映射错误或丢失。为了节省我查看注入依赖项的每个地方,我读到添加“ng-strict-di”将查明映射不正确的位置。这使得错误在未缩小的代码中被拾起,但它指向一个所有依赖关系都正确映射的工厂。如上所述注释掉代码行会使错误消失,这真的很奇怪。好像跟 DI 没什么关系。
-
不,问题不在于发布的第三方代码。
OTSession.streams.push(event.stream)可能会间接影响应用程序的其他部分,但仅此而已。正如错误所说,问题出在某些控制器上。 -
你能提供它的plunker链接吗,当前发布的代码不相关。也请发布 html 部分,看来您的 ng-app 不是您在此处发布的那个