Angular 的控制器方法如何使 $scope 可用于我的函数参数

2024-01-03

我正在寻找伪代码答案或概念答案。


经过多年的编程,我从未创建过接收函数参数的类方法,以便该方法的调用者自动访问“不可见”属性。

如果我尝试在我的范围之外访问 $scopemy_app.controller(...)方法,我收到一个错误,所以我知道它不是全局的;如果我尝试从以下位置访问它my_app.$scope or angular.$scope我变得不确定。

那么我的函数参数如何访问它:

    my_app.controller('my_controller' , function( $scope , ... ) { ... }

更新(正如我正在学习的那样):

  // javascript
  var my_class =   function( argument_A )                 
                       { this.some_prop = argument_A ;        

                         this.some_method = function( argument_B ) 
                           { console.log( argument_B ) ; // function(boo)
                           } ;
                       } ;

  var my_instance = new my_class( "my_string" ) ;

  var my_function_argument = function( boo ){ } ;
  my_instance.some_method( my_function_argument ) ; 

函数是一等公民

In JavaScript and other modern languages (Scala, Haskell, LISP, etc.), functions are treated as first-class citizens. Specifically, this means the language supports passing functions as arguments to other functions, returning them as the values from other functions, and assigning them to variables or storing them in data structures. Some programming language theorists require support for anonymous functions (function literals) as well. In languages with first-class functions, the names of functions do not have any special status; they are treated like ordinary variables with a function type.1 https://en.wikipedia.org/wiki/First-class_function

上面的例子可以重构为:

var myController = function ($scope, ... ) {
     console.log($scope);
     $scope.message = "Hello world"
};

my_app.controller('my_controller' , myController );

在这种情况下.controller方法存储myControllerAngularJS 缓存中的对象$controllerProvider服务。 IE。cache["my_controller"] = myController;

后来当$compile服务遇到需要控制器的指令:

<div ng-controller="my_controller">
    {{message}}
</div>

The $compile服务创建一个新范围,检索myController函数从$controller服务缓存,并使用新作用域作为函数的第一个参数来调用该函数。

The $compile服务还创造了$watch监听功能,跟踪$scope.message多变的。在每个消化周期,如果$scope.message发生变化时,DOM 会相应更新。

在问题的示例中:

//These are function invocations, the variable must be defined

console.log( boo )              ; //    ERROR: boo is not defined
my_instance.some_method( boo )  ; //    ERROR: boo is not defined

最后一种形式使用匿名函数文字(或函数表达式)。匿名函数是作为参数传递给名为的方法的对象.some_method.

//The anonymous function is an object passed as an argument
//boo is a parameter to be supplied when the function is invoked

my_instance.some_method( function( boo ) { } ) ; // NO ERROR

有关函数文字的更多信息,请参阅MDN JavaScript 参考 -- 函数表达式 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function*.


依赖注入和按名称连接参数

通常在 JavaScript 中,函数参数是相连的按位置。在AngularJS框架中,函数参数被注入by name。这是怎么做到的?

来自文档:

推理

在 JavaScript 中调用toString()on 函数返回函数定义。然后可以解析定义并提取函数参数。

-- AngularJS $injector 服务 API 参考 -- 推理 https://docs.angularjs.org/api/auto/service/%24injector#inference

所以在例子中:

my_app.controller('my_controller' , function( $scope , ... ) { ... }

The $injector服务做了一个toString()控制器构造函数并对其进行解析。该服务检测到$scope是函数的第一个参数,并使用该知识来正确调用该函数。

你可以看到fn.toString()正在使用在源代码中 https://github.com/angular/angular.js/blob/master/src/auto/injector.js#L72.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 的控制器方法如何使 $scope 可用于我的函数参数 的相关文章

随机推荐

  • 更改 PHP.ini 位置文件?

    我在 OSX 上使用 apache2 默认情况下php ini位置是 private etc php ini 我需要把它改成这样 Library FileMaker Server Web Publishing publishing engi
  • Delphi 2010-IDE 不断停止在 CPU 调试窗口

    我在 D2010 IDE 中不断出现 CPU 调试窗口 我注意到这出现在一些断点上 而其他一些断点则不会导致这种效果 无法解释这种情况到底何时发生或哪些断点导致这种情况 但似乎当调试器无法到达代码上的断点时 它会停止在方法的开始地址上 并且
  • 在 jar 中包含属性/配置文件是一种不好的做法吗?

    例如 MyApp 是一个 Web 应用程序 其中包含一个属性文件 server properties 该文件描述应用程序的配置数据 例如服务器名称 在开发阶段 server properties 位于其自己的 IDE 项目文件夹中 它的逻辑
  • 当终端关闭时终止 sudo python 脚本

    如何判断运行 python 脚本的终端是否已关闭 如果用户关闭终端 我想安全地结束我的 python 脚本 我可以使用处理程序捕获 SIGHUP 但当脚本作为 sudo 运行时则不行 当我使用 sudo 启动脚本并关闭终端时 python
  • 模拟内存不足警告不起作用

    我有一个UIWebView in a UIViewController 我正在尝试将此视图控制器推送到现有的UINavigationController 它有另一个视图控制器 它也有一个UIWebView在里面 推动第一个视图控制器后 我尝
  • 单击时切换 CSS3 动画

    在没有 JavaScript 的情况下 在点击时改变 CSS3 动画方向的最佳方法是什么 我最近一直在探索复选框黑客 并试图找到一种方法 只使用一组关键帧 而不是两组 一个前进 一个返回 这可能吗 或者有没有办法用一套来做到这一点 例如我有
  • 如何删除mysql数据库中的重复记录?

    使用rails或mysql查询删除mysql数据库中重复记录的最佳方法是什么 您可以通过以下方式将不同的记录复制到新表中 select distinct into NewTable from MyTable
  • 如何使用 Gradle 运行多个命名测试?

    我知道怎么说 gradle test tests mypackage MyTest 但如何指定多个呢 gradle test tests mypackage MyTest mypackage model ModelTest BasicTes
  • 了解 Qt 中的表单布局机制

    Qt具有灵活且强大的布局机制来处理桌面应用程序窗口的视图 但它是如此灵活 以至于当出现问题并需要微调时 它几乎无法被理解 而且如此强大 以至于它可以击败任何试图压倒 Qt 关于表单外观的观点的人 那么 谁能解释一下 或者提供一下Qt的定位机
  • PDO 因记录过多、缓冲查询而失败

    这个脚本昨天运行良好 但是今天 由于我最初选择的表中现在有大约 150 000 条记录 所以它失败了 说我正在从 null 获取 据我所知 这是因为我的记录太多了 因此 我最终通过向初始查询 1000 添加限制和这一行来纠正它 MysqlC
  • Bash 中的文件名未正确打印,带有下划线“_”[重复]

    这个问题在这里已经有答案了 我正在用这个 DATE FOLDER date b d a G FILENAME HOME date1 tar gz echo BACKUP DESTINATION DATE FOLDER FOLDERNAME
  • Python 继承:何时以及为何使用 __init__

    我是一个Python新手 试图理解继承方法背后的哲学 逻辑 问题最终涉及为什么以及何时必须使用 init 子类中的方法 例子 看来从超类继承的子类不需要有自己的构造函数 init 方法 下面 狗继承了哺乳动物的属性 名字 年龄 和方法 发出
  • 产品密钥的正则表达式

    我正在尝试做一个正则表达式来显示所有具有该值的产品密钥 这是我创建的正则表达式 A Z0 9 5 A Z0 9 5 A Z0 9 5 A Z0 9 5 A Z0 9 5 由于某种原因它不起作用 您打算使用哪种正则表达式工具 grep egr
  • 无法登录活动管理。有什么办法可以创建管理员用户吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我尝试使用默认管理员用户登录时 我收到 无效的电子邮件或密码 有没有办法用代码创建用户并尝试以这种方式登录 我可以登录我的实时网站 但不
  • 像 Perl 一样在 JavaScript 正则表达式中嵌入注释

    有没有办法在 JavaScript 正则表达式中嵌入注释 例如你可以用 Perl 做 https stackoverflow com questions 632795 how do you comment a perl regular ex
  • WCF - 序列化继承类型

    我有这些课程 DataContract public class ErrorBase DataContract public class FileMissingError ErrorBase DataContract public clas
  • 如何找到上次访问数据库的时间?

    在 SQL Server 2005 中 您能否轻松确定某人上次查询数据库的时间 扩展詹姆斯 艾伦的答案 SELECT d name last user seek MAX last user seek last user scan MAX l
  • 在 C++ 中使用 RK-4 求解洛伦兹方程

    我用 C 编写了使用 RK 4 方法求解洛伦兹方程的代码 我必须绘制吸引子图 并且在使用 RK 4 方法求解 3 一阶耦合微分方程时遇到一些困难 这是我的代码 Solving 3 coupled first order differenti
  • 系统在哪里存储图标位置?

    任何文件夹上的 图标视图 和 文件夹视图 实际上都是 SysListView 如果取消选中 自动排列图标 您可以在图标周围移动 下次打开文件夹时 所有图标都将位于与上次相同的位置 我的问题是 系统在哪里存储图标的 x 和 y 位置 设置为桌
  • Angular 的控制器方法如何使 $scope 可用于我的函数参数

    我正在寻找伪代码答案或概念答案 经过多年的编程 我从未创建过接收函数参数的类方法 以便该方法的调用者自动访问 不可见 属性 如果我尝试在我的范围之外访问 scopemy app controller 方法 我收到一个错误 所以我知道它不是全