2017-03-15 13 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) { 

}]); 

这应该解决这个问题。

相关问题