在 Angular 中,使用 controller时,如果需要某 service,只需要在参数中写上这个 service的名称即可。
那么是如何实现的呢?
问题思考:
javascript 中如何获取函数的参数的名称/字面值?
在 javascript 中是否有方法获取 function 的参数的 名称的值?
比如:
function doSomething(param1, param2, .... paramN)
{
// fill an array with the parameter name and value
// some other code
}
如何获取 doSomething 函数的参数的名称列表?
回答一:
下面的方法可以返回函数的参数(简单格式的参数)
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var ARGUMENT_NAMES = /([^\s,]+)/g;
function getParamNames(func) {
var fnStr = func.toString().replace(STRIP_COMMENTS, '');
var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
if(result === null)
result = [];
return result;
}
测试:
getParamNames(getParamNames) // returns ['func']
getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d']
getParamNames(function (a,/*b,c,*/d){}) // returns ['a','d']
getParamNames(function (){}) // returns []
回答二:
下面的代码从 Angular 的源码中拷贝的。用于其依赖注入机制的使用。
http://docs.angularjs.org/tutorial/step_05
如果 controller 在其构造函数的参数列表中含有对某个 service 名称的引用,当 controller 的构造方法被调用时, Angualr 的依赖注入机制提供 service 给 controller。依赖注入机制还负责 service 本身依赖其它 service 时的过渡service的创建。
注意: 参数的名称很重要。因为依赖注入机制依靠参数的名称去获取对应的服务。
/**
* @ngdoc overview
* @name AUTO
* @description
*
* Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.
*/
var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(.+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function annotate(fn) {
var $inject,
fnText,
argDecl,
last;
if (typeof fn == 'function') {
if (!($inject = fn.$inject)) {
$inject = [];
fnText = fn.toString().replace(STRIP_COMMENTS, '');
argDecl = fnText.match(FN_ARGS);
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
arg.replace(FN_ARG, function(all, underscore, name){
$inject.push(name);
});
});
fn.$inject = $inject;
}
} else if (isArray(fn)) {
last = fn.length - 1;
assertArgFn(fn[last], 'fn')
$inject = fn.slice(0, last);
} else {
assertArgFn(fn, 'fn', true);
}
return $inject;
}
引用:
How to get function parameter names/values dynamically from javascript
--转载请注明出处:http://lixh1986.iteye.com/blog/2314610
--
分享到:
相关推荐
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] where: -C - command executed in the remote classfile. (optional , default command is "open /Applications/...
在压缩包中有一个文件名为 "JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar",这很可能是一个Java可执行的jar文件,其中封装了用于演示JNDI注入攻击或者进行安全测试的代码。用户可以通过运行这个jar文件来触发或者...
该压缩包"JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar"可能包含了一个JNDI注入攻击的示例或者测试工具,"SNAPSHOT"通常表示这是一个开发中的版本,可能尚未经过完整测试,因此可能存在漏洞或不稳定性。使用这样的...
本文将通过分析"making-sense-dependency-injection-test-execution-listener-源码"来深入探讨这两个概念。 1. 依赖注入(Dependency Injection) 依赖注入的核心思想是,对象不应该自行创建或查找它所依赖的对象...
AngularJS的双向数据绑定是其最显著的特点之一。它自动同步模型(Model)和视图(View)的数据,使得UI和应用状态始终保持一致。当你在视图中做出更改时,模型会自动更新;反之亦然。这种机制减少了开发者手动管理...
在这个"dependency_injection-develop-源码"压缩包中,我们可以深入理解依赖注入的实现原理及其在实际开发中的应用。 依赖注入的核心思想是将对象之间的依赖关系从对象内部移出,转由外部容器来管理。这样,对象...
这个压缩包"dependency_injection-1_0-final-spec.zip"包含了对Java依赖注入规范1.0版本的详细定义,包括API jar文件(javax.inject.jar)、Javadoc文档(javax.inject-javadoc.zip)以及源码(javax.inject-src.zip...
2. 服务:在AngularJS中,服务(Service)是一种可复用的代码块,可以被注入到其他控制器(Controller)、指令(Directive)、过滤器(Filter)等中。 3. 提供者(Provider):提供者是用于配置依赖项的一个高级抽象...
首先,文件标题“mysql-injection.pdf”和描述“MySQL注入天书---------Sqli-labs 使用手册”明确指出了文档的主题,即如何进行MySQL注入以及sqli-labs工具的使用说明。sqli-labs是一个SQL注入学习平台,可以让学习...
AngularJS的依赖注入(Dependency Injection,简称DI)是一种软件设计模式,用于管理应用程序中的对象如何获取它们所需的依赖。依赖注入的主要目标是降低组件之间的耦合,使得代码更加灵活、可测试和可维护。 1. ...
在AngularJS中,数据绑定是其核心特性之一,它允许开发者在视图和模型之间建立直接的连接。双向数据绑定使得视图的改变能够实时反映到模型中,反之亦然。在这个阶段的源码中,我们可以看到如何通过`ng-model`指令...
- **依赖注入(Dependency Injection)**:AngularJS的依赖注入机制使得开发者可以更容易地管理对象间的依赖关系,提高了代码的可测试性和可维护性。 #### 如何在ASP.NET MVC项目中引入AngularJS 要在ASP.NET MVC...
java asm jndi_JNDI-Injection-Exploit,用于log4j2漏洞验证 可执行程序为jar包,在命令行中运行以下命令: $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] 其中: -C ...
AngularJS是一个流行的前端框架,它的核心特性之一就是依赖注入(Dependency Injection,简称DI)。依赖注入是设计模式的一种,它实现了控制反转(Inversion of Control,简称IoC),使得代码之间的耦合度降低,提高...
AS-23-Koh-Dirty-Bin-Cache-A-New-Code-Injection-Poisoning-Binary-Translation-Cache
《Java EE 8 设计模式与最佳实践》源码分析 在Java开发领域,Java EE(Enterprise Edition)作为企业级应用开发的标准平台,为开发者提供了丰富的功能和组件。设计模式和最佳实践是Java EE开发中不可或缺的部分,...
3. **依赖注入**:AngularJS 的依赖注入(Dependency Injection,DI)机制允许组件轻松获取所需的依赖服务,如 `$http` 用于HTTP请求,`$scope` 用于管理作用域内的数据。这提高了代码的可测试性和可维护性。 4. **...
2. **依赖注入**:AngularJS的依赖注入(Dependency Injection,DI)系统简化了对象之间的协作。通过阅读源码,可以了解如何定义服务、控制器、过滤器等,并使用`angular.module`和`angular.injector`进行注入。 3....
【标签】虽然没有具体的标签,但根据标题可以推断,相关的标签可能包括:AngularJS、前端开发、单页应用、住宅顾问、项目源码、JavaScript框架、Web开发等。 在源代码中,我们可能会看到以下关键知识点: 1. **...