[AngularJS]没有角的控制器方法如何使 $scope 可供我函数参数

发布时间: 2017/4/16 21:36:38
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我要寻找伪代码答案或概念答案请。


经过好几年的编程,我永远不会创建了接收函数的参数,这样的方法的调用方自动获取对隐形属性的访问类方法。

如果我试着访问外部的 $scope 我 my_app.controller(...) 方法,我可以得到一个错误,所以它不是全球性的; 如果我尝试访问它从 my_app.$scopeangular.$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 ) ; 

解决方法 1:

函数是头等公民

在 JavaScript 和其他现代语言 (Scala、 哈斯克尔、 口齿不清等),函数被视为一流公民。具体而言,这意味着语言支持传递函数作为其他函数,将他们作为值返回从其他的函数,并将它们分配给变量或将它们存储在数据结构中的参数。一些编程语言理论家以及需要匿名函数 (函数文本) 的支持。在语言中具有一流功能的函数的名称并没有任何特殊的地位;他们就像普通变量与函数类型。1

上面的例子可以作为重新构造︰

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

my_app.controller('my_controller' , myController );

在这种情况下 .controller 方法商店 myController AngularJS 缓存中的对象 $controllerProvider 服务。I.e. cache["my_controller"] = myController;

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

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

$compile服务将创建一个新的范围、 检索 myController 函数从 $controller 服务缓存,并作为第一个参数的函数调用具有新的作用域的函数。

$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 参考 — — 函数表达式


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

通常在 JavaScript 中,函数的参数是连接的位置。在 AngularJS 框架中,函数参数的注入的名字。这是如何做的?

从文档︰

推理

在 JavaScript 调用 toString() 函数返回的函数定义。然后可以分析的定义和函数参数可以提取。

— — AngularJS $injector 服务 API 参考 — — 推理

这样的例子︰

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

$injector服务 toString() 对控制器建筑功能和解析它。服务检测到 $scope 是第一个参数的函数,利用这一知识来正确地调用该函数。

你可以看到 fn.toString() 被使用在源代码中在这里

赞助商