【问题标题】:Get module and controller|service|directive names at runtime在运行时获取模块和控制器|服务|指令名称
【发布时间】:2015-05-31 10:24:51
【问题描述】:

angular-logger,我们正在尝试增强$log,但我们希望以角度模块和组件的名称工作而不做任何更改。为此我们需要在运行时获取AngularJS的context,即模块名控制器、服务指令 名字。

app.module("SampleModule").
   controller("ControllerOne", function ($log) {
      $log.debug("I am ready!")
   }).
   controller("ControllerTwo", function ($log) {
      $log.debug("I am ready!")
   });

默认$log 输出:

> I am ready!
> I am ready!

如果我们可以在运行时获取模块和控制器名称,那么使用增强的$log可以得到更丰富的输出:

> SampleModule.ControllerOne: I am ready!
> SampleModule.ControllerTwo: I am ready!

最好的选择是在不更改控制器代码的情况下获取它。也许有办法获取有关接收 $log 依赖注入的实体的一些元信息?

有什么建议吗?

【问题讨论】:

  • 您可以创建一个指令 ng-controller,它将为每个控制器执行,并将提供给 ng-controller 的内容解析为字符串,并将其设置在 score 中的某个变量上。然后使用该变量来打印控制器名称
  • angular 会执行所有指令,如果找到多个同名指令

标签: angularjs logging


【解决方案1】:

SO 上有一个similar question that I found,但该解决方案仅在使用控制器作为语法时才有效。

// a simple route with controller as syntax
$routeProvider.when(
    '/myRoute', 
    { 
        templateUrl: '/myRoute', 
        controller: 'ControllerOne as vm' 
    }
);

// controller
app.controller("ControllerOne", ['$log', function ControllerOne($log) {
    var vm = this;
    $log.log(vm.constructor.name); 
}]);

【讨论】:

  • @Plantface,我看到了你的编辑。为什么你认为“角度数组注释对于教育目的是多余的”。
  • 数组注释用于解决仅在缩小期间发生的问题。在这种情况下,它没有附加价值,只会帮助掩盖相关信息。 su·per·flu·ous, adj.: exceeding what is sufficient or required
  • 遗憾的是,它只适用于控制器,而忽略了服务和指令的日志增强功能。我想用上下文执行来解决包装问题,前段时间我读到了一个框架,它可以用于测试或线程执行,但我不记得它的名字了。
  • 是的,这是一个限制,但找不到任何解决方法。如果您将来设法解决此问题,请分享。
  • 答案部分正确,但也具有误导性,因为不需要“控制器作为”-您只需要具有控制器功能(在这种情况下,ControllerOne - 功能名称,不是控制器)被命名 - 即不是匿名的。换句话说,这不起作用:.controller("MainCtrl", function(){..}) 即使使用“控制器作为”。所以,
猜你喜欢
  • 2020-05-06
  • 2013-06-16
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 2018-10-05
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多