我在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