【问题标题】:Angular 1.5, strict mode annotation finding error on seemingly irrelevant lineAngular 1.5,严格模式注释在看似无关的行上发现错误
【发布时间】: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 不是您在此处发布的那个

标签: angularjs strict


【解决方案1】:

用这个符号写你的控制器函数。

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

}]);

这应该可以解决问题。

【讨论】:

    【解决方案2】:

    您能否将 $rootScope 注入添加到您的控制器中,以便在缩小时不会出现任何问题,例如 XXXController.$inject = ['$rootScope'];

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 2016-08-09
      • 2019-12-25
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多