2017-03-15 21 views
0

我在Angular中遇到了一個經典問題,當我縮小代碼時,由於參數損壞,我得到'未知提供者'。Angular 1.5嚴格模式註解在看起來不相關的行上發現錯誤

我讀了關於ng-strict-di指令(我希望我會在幾個月前知道的!),以強制執行字符串等效參數。

這有助於我縮小我的問題,因爲我現在用我的unminified代碼得到這個堆棧跟蹤:

enter image description here

所以,問題似乎是在第三方庫,我已作了評論的發生錯誤:

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);那麼錯誤就會消失。這似乎很奇怪,因爲它所做的只是將對象推送到數組。

+0

我不知道是否是由於opentok庫模塊,我認爲你有注射依賴關係的另一個問題。你可以閱讀更多關於:http://stackoverflow.com/a/33494259/861206 但是在你的應用程序的某個地方,你調用了沒有使用它們的映射器注入的函數,所以應用程序的函數映射了未定義的錯誤函數。 像如果我做的: .controller( 「FirstController」, [ 「$ rootScope」, 「$ HTTP」, 「$濾波器」,功能($範圍,$ HTTP,$濾波器){ } ]) $作用域將是控制器內的應用程序的$ rootScope。 – rbinsztock

+0

謝謝。我意識到,問題在於注入時映射錯誤或丟失。爲了節省我在每個注入依賴關係的地方查看,我讀到添加'ng-strict-di'將查明映射不正確的位置。這使得在未縮小的代碼中找到錯誤,但它指向一個工廠,在該工廠中所有依賴關係都已正確映射。真正奇怪的是,如上所述註釋掉代碼行會導致錯誤消失。它似乎與DI沒有任何關係。 –

+0

不,問題不在發佈的第三方代碼中。 'OTSession.streams.push(event.stream)'可能會間接影響應用程序的其他部分,但僅此而已。如錯誤所述,問題在於某個控制器。 – estus

回答

0

你可以添加$ rootScope注入到你的控制器,以便儘量縮小這個不應該得到任何問題,如XXXController。$ inject = ['$ rootScope'];

2

用這種表示法寫你的控制器功能。

module.controller('AppCtrl', ['$scope','$timeout', function 
($scope,$timeout) { 

}]); 

這應該解決這個問題。

相關問題