$ angularScope准备好角文档

时间:2014-12-18 13:48:20

标签: angularjs angularjs-scope angularjs-service

我有这段代码:

.service('webSocket', function ($rootScope, socketFactory, CONFIG, $timeout) {
    angular.element(document).ready(function () {
        $rootScope.log('Waiting for connection...',CONSOLE_INFO);
    });

我收到了这个错误:

  

TypeError:$ rootScope.log不是函数

此服务注入此控制器:

.controller('mainCtrl', function mainCtrl($scope, $rootScope, webSocket, myConsole ...

我有:

$rootScope.log = function (msg, type) { myConsole.log(msg,type); ... };

你能告诉我问题出在哪里吗?或者至少指出我正确的方向?我使用文档就绪功能的原因是因为除了将消息记录到浏览器控制台(console.log)之外,我还使用了用户(pNotify库)的通知,这些通知需要在加载DOM后调用。

2 个答案:

答案 0 :(得分:2)

使用$rootScope在服务之间共享内容通常应被视为反模式。如果您没有为不同的控制器提供不同的控制台实现,您可以使用Angular-way并在config块中执行所有配置。订阅服务中的文档就绪事件也不是一个好主意(我更愿意在run块中执行),因为角度服务在任何其他服务或控制器或其他任何设备第一次需要时实例化。为了获得可能具有不同控制台实现的可配置服务,我将使用provider实现它,如下所示:

angular.module('app',[]).
  constant('console', console).
  constant('PNotify', PNotify).
  provider('myConsole', function() {
    var log = angular.noop;
    function MyConsoleFactory() {
      return {
        log: log,
        debug: log
      }
    }
    this.setLog = function(logImplementation) {
      log = logImplementation
    }
    this.$get = [MyConsoleFactory];
  }).
  config(['myConsoleProvider', 'console', 'PNotify', function(myConsoleProvider, console, PNotify) {
    myConsoleProvider.setLog(function(msg) {
      console.log('[LOG] '+ Date.now() + ':\t' + msg);
      new PNotify({
        title: 'Title',
        text: msg
      });
    });
  }]).
  run(['myConsole', '$document', function(myConsole, $document) {
    $document.ready(function () {
      myConsole.log('Waiting for connection...');
    });
  }]);

在这种情况下,您根本不需要任何控制器。

Plunker:http://plnkr.co/edit/aV9TIO07pnDs26xDBPtf?p=preview

答案 1 :(得分:0)

这是因为服务代码在服务添加到控制器之前运行(其中定义了$rootScope.log方法)。您可以将$rootScope.log = function (msg, type) { myConsole.log(msg,type); ... };移到app.run(...)方法中,它会起作用。