【问题标题】:Accessing an Angular.JS controller's name property in JavaScript (why is it the module's name?)在 JavaScript 中访问 Angular.JS 控制器的 name 属性(为什么它是模块的名称?)
【发布时间】:2014-12-11 15:22:12
【问题描述】:

我有 some simple Angular.js code 不明白。

HTML:

<div ng-controller="MyCtrl">
  Hello, {{name}}!
</div>

JavaScript:

var myApp = angular.module('myApp',[]);

var controller = myApp.controller('MyCtrl', ['$scope', function ($scope) {
    $scope.name = 'Superhero';
}]);

alert(controller.name);

HTML 指令产生了我所期望的:“你好,超级英雄!”被渲染到页面。但是警报框令人困惑。我希望它显示字符串“Superhero”,或者控制器的名称“MyCtrl”,但它实际显示的是模块的名称“MyApp”。为什么?我需要传递给alert 以显示分配给控制器范围的名称(即“Superhero”)或控制器本身的名称(即“MyCtrl”)?

(注意,我确实尝试过the documentation,但它并没有帮助我解开为什么控制器报告的是模块的名称而不是它自己的名称。)

【问题讨论】:

  • myApp.controller() 返回模块,以便您可以将注册链接在一起
  • 这说明正在发生的事情。如何以编程方式访问我刚刚创建的控制器?另外,myApp.controller() 的文档在哪里? The documentation I was looking at 建议它返回控制器,但这可能是错误的页面

标签: angularjs


【解决方案1】:

您想从旧代码中访问 Angular 的代码。

我的做法是使用 angular.element:

<div id="myDiv" ng-controller="MyCtrl">
  Hello, {{name}}!
</div>   

var theScope = angular.element(getElementById('myDiv')).scope();
alert(theScope.name);

【讨论】:

  • 所以在我的代码中获取我刚刚创建的控制器的方法是在 DOM 中搜索它吗?这会起作用(谢谢),但看起来很奇怪。
  • 当你这样想的时候并不奇怪 - dom 元素是唯一可以按照你的意愿行事的元素,因为控制器本身可以在许多其他 dom 元素中使用@dumbledad跨度>
  • 但这不正是您想要访问控制器本身的原因吗?
  • 我无法确定,因为我不确定您从遗留代码访问它时的意图是什么。我所知道的是,单个控制器可以多次启动,并且您的“名称”范围变量具有多个值。只有启动 CTRL 的 DOM 元素有一个 name 值
  • 这有帮助,谢谢。我不确定您所说的“遗留代码”是什么意思(我通常将其解析为以前语言、项目或版本的代码)。这里的“遗留代码”是什么意思?
猜你喜欢
  • 2015-05-11
  • 2012-02-17
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2014-05-23
  • 2020-01-30
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多