详解angularjs的数组传参方式的简单实现
发布时间 - 2026-01-11 02:32:41 点击率:次初学 angularjs时,对 数组传参方式感到很好奇([‘a', ‘b', function(a,b){}]),它到底怎么实现的呢?后来由于工作很忙,对这个问题也就慢慢忘记了。

今天闲来无事,有想到了这个问题。最简单的方法就是查看他的源代码。无奈本人E文不好,不说看他的设计逻辑,仅看英文注释就够我头疼了。尝试闭门造车,最终竟然把车造出来了。
既然自己造的车,就要带上自己的名(取姓名拼音第一个字母),就叫他mqyJs把,下面是演示的调用方法:
var app2 = mqyJs.applicationCreate([{ name: '直接传入SCOPE' }, '$hello', '$world', function($scope, $hello, $world) {
return $scope.name + ": " + $hello.name + $world.name;
}]);
核心部分如下:
//框架开设
var mqyJs = {
//服务注册
servicesList: {},
servicesRegister: function(name, value) {
this.servicesList[name] = value;
},
//应用创建
applicationList: [],
applicationCreate: function(_opts, _args) {
if (!_args) {
_args = _opts;
_opts = {}
}
_opts.scope = _opts.scope || {
name: 'SCOPE没有设置'
};
if (!(_args instanceof Array)) {
_args = ['$scope', _args];
}
if (typeof _args[_args.length - 1] != 'function') {
throw new Error('参数中没有指定运行函数');
}
_args.map((arg, index) => {
if (typeof arg == 'string') {
if (arg === '$scope') {
_args[index] = _opts.scope;
} else {
if (!!arg && !(arg in this.servicesList)) {
throw new Error('插件:' + arg + ' 还没有注册');
}
_args[index] = this.servicesList[arg];
}
}
});
return this.applicationList[this.applicationList.push({
run: function(callback) {
if (typeof callback != 'function') {
callback = function(_opts) { return _opts; }
}
return callback(_args[_args.length - 1].apply(null, _args));
}
}) - 1];
}
};
//框架结束
通过 servicesRegister,可以注册 服务,比如 angularjs 的 $http;
//插件开始
mqyJs.servicesRegister('$hello', {
name: '你好'
});
mqyJs.servicesRegister('$world', {
name: '世界'
});
mqyJs.servicesRegister('$china', {
name: '中国'
});
//插件结束
最终,对所有注册的应用,自动执行
/**
* 初始化完成后系统自动运行
* 比如网页中 放到 window.onload
*/
mqyJs.applicationList.map(function(app, index) {
console.log('自动调用 -> APP #' + index + ' -> ' + app.run());
});
尝试跑一下代码,能自动识别参数类型,完美执行。
不传入 $scope 时,程序会自动创建一个 $scope。
//演示代码 开始
var app = mqyJs.applicationCreate(['$scope', '$hello', '$china', function($scope, $hello, $china) {
return $scope.name + ": " + $hello.name + $china.name;
}]);
var app2 = mqyJs.applicationCreate([{ name: '直接传入SCOPE' }, '$hello', '$world', function($scope, $hello, $world) {
return $scope.name + ": " + $hello.name + $world.name;
}]);
var app3 = mqyJs.applicationCreate([{ name: 'world也直接传入' }, '$hello', { name: '地球' }, function($scope, $hello, $world) {
return $scope.name + ": " + $hello.name + $world.name;
}]);
var app4 = mqyJs.applicationCreate(function($scope) {
return $scope.name;
});
var opts = {
scope: {
name: '自定义SCOPE'
}
};
var app5 = mqyJs.applicationCreate(opts, function($scope) {
return $scope.name;
});
app4.run(function(result) {
console.log('手动调用 -> RESULT -> ' + result);
});
//演示代码 结束
为了方便测试,再把代码重新写一遍,直接复制下面的代码到 浏览器控制台即可测试
//框架开设
var mqyJs = {
//服务注册
servicesList: {},
servicesRegister: function(name, value) {
this.servicesList[name] = value;
},
//应用创建
applicationList: [],
applicationCreate: function(_opts, _args) {
if (!_args) {
_args = _opts;
_opts = {}
}
_opts.scope = _opts.scope || {
name: 'SCOPE没有设置'
};
if (!(_args instanceof Array)) {
_args = ['$scope', _args];
}
if (typeof _args[_args.length - 1] != 'function') {
throw new Error('参数中没有指定运行函数');
}
_args.map((arg, index) => {
if (typeof arg == 'string') {
if (arg === '$scope') {
_args[index] = _opts.scope;
} else {
if (!!arg && !(arg in this.servicesList)) {
throw new Error('插件:' + arg + ' 还没有注册');
}
_args[index] = this.servicesList[arg];
}
}
});
return this.applicationList[this.applicationList.push({
run: function(callback) {
if (typeof callback != 'function') {
callback = function(_opts) { return _opts; }
}
return callback(_args[_args.length - 1].apply(null, _args));
}
}) - 1];
}
};
//框架结束
//插件开始
mqyJs.servicesRegister('$hello', {
name: '你好'
});
mqyJs.servicesRegister('$world', {
name: '世界'
});
mqyJs.servicesRegister('$china', {
name: '中国'
});
var app = mqyJs.applicationCreate(['$scope', '$hello', '$china', function($scope, $hello, $china) {
return $scope.name + ": " + $hello.name + $china.name;
}]);
var app2 = mqyJs.applicationCreate([{ name: '直接传入SCOPE' }, '$hello', '$world', function($scope, $hello, $world) {
return $scope.name + ": " + $hello.name + $world.name;
}]);
var app3 = mqyJs.applicationCreate([{ name: 'world也直接传入' }, '$hello', { name: '地球' }, function($scope, $hello, $world) {
return $scope.name + ": " + $hello.name + $world.name;
}]);
var app4 = mqyJs.applicationCreate(function($scope) {
return $scope.name;
});
var opts = {
scope: {
name: '自定义SCOPE'
}
};
var app5 = mqyJs.applicationCreate(opts, function($scope) {
return $scope.name;
});
app4.run(function(result) {
console.log('手动调用 -> RESULT -> ' + result);
});
//插件结束
mqyJs.applicationList.map(function(app, index) {
console.log('自动调用 -> APP #' + index + ' -> ' + app.run());
});
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# angularjs
# 数组传参
# 传数组参数
# 传递数组
# AngularJS ng-repeat数组有重复值的解决方法
# AngularJS中比较两个数组是否相同
# AngularJS下对数组的对比分析
# angularJS利用ng-repeat遍历二维数组的实例代码
# mongoDB 多重数组查询(AngularJS绑定显示 nodejs)
# Angular ng-repeat 对象和数组遍历实例
# angular ng-repeat数组中的数组实例
# Angular.js中数组操作的方法教程
# Angular.js前台传list数组由后台spring MVC接收数组示例代码
# AngularJS遍历获取数组元素的方法示例
# 还没有
# 这个问题
# 自定义
# 中国
# 自己的
# 你好
# 地球
# 无事
# 第一个
# 也就
# 闭门造车
# 一遍
# 自动识别
# 英文
# 看他
# 叫他
# 最简单
# 再把
# 创建一个
# 很忙
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在新浪SAE免费搭建个人博客?
深圳网站制作平台,深圳市做网站好的公司有哪些?
网站制作软件有哪些,制图软件有哪些?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
WordPress 子目录安装中正确处理脚本路径的完整指南
如何用wdcp快速搭建高效网站?
如何在Windows 2008云服务器安全搭建网站?
使用豆包 AI 辅助进行简单网页 HTML 结构设计
浅谈redis在项目中的应用
Python自动化办公教程_ExcelWordPDF批量处理案例
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
详解jQuery中的事件
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
Laravel中的withCount方法怎么高效统计关联模型数量
网站制作企业,网站的banner和导航栏是指什么?
PHP 500报错的快速解决方法
Linux系统命令中screen命令详解
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
Laravel如何自定义错误页面(404, 500)?(代码示例)
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
制作企业网站建设方案,怎样建设一个公司网站?
如何在Windows环境下新建FTP站点并设置权限?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
如何选择可靠的免备案建站服务器?
装修招标网站设计制作流程,装修招标流程?
如何登录建站主机?访问步骤全解析
JavaScript数据类型有哪些_如何准确判断一个变量的类型
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
如何在VPS电脑上快速搭建网站?
如何快速生成凡客建站的专业级图册?
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
公司网站制作需要多少钱,找人做公司网站需要多少钱?
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
如何在橙子建站中快速调整背景颜色?
英语简历制作免费网站推荐,如何将简历翻译成英文?
Laravel如何使用查询构建器?(Query Builder高级用法)
大型企业网站制作流程,做网站需要注册公司吗?
Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】
如何用PHP快速搭建CMS系统?
智能起名网站制作软件有哪些,制作logo的软件?
如何快速辨别茅台真假?关键步骤解析
Python函数文档自动校验_规范解析【教程】
Laravel怎么清理缓存_Laravel optimize clear命令详解
JS碰撞运动实现方法详解

