初学 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遍历获取数组元素的方法示例
# 还没有
# 这个问题
# 自定义
# 中国
# 自己的
# 你好
# 地球
# 无事
# 第一个
# 也就
# 闭门造车
# 一遍
# 自动识别
# 英文
# 看他
# 叫他
# 最简单
# 再把
# 创建一个
# 很忙
相关文章:
如何选择高效便捷的WAP商城建站系统?
如何选择CMS系统实现快速建站与SEO优化?
高端云建站费用究竟需要多少预算?
免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?
建站主机与服务器功能差异如何区分?
如何用搬瓦工VPS快速搭建个人网站?
网站app免费制作软件,能免费看各大网站视频的手机app?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
如何高效搭建专业期货交易平台网站?
C++中引用和指针有什么区别?(代码说明)
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
建站之星价格显示格式升级,你的预算足够吗?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
Swift中循环语句中的转移语句 break 和 continue
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
如何在阿里云虚拟服务器快速搭建网站?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何快速生成凡客建站的专业级图册?
如何获取免费开源的自助建站系统源码?
教学论文网站制作软件有哪些,写论文用什么软件
?
南宁网站建设制作定制,南宁网站建设可以定制吗?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
c# 在高并发场景下,委托和接口调用的性能对比
家庭建站与云服务器建站,如何选择更优?
音乐网站服务器如何优化API响应速度?
如何快速登录WAP自助建站平台?
如何用西部建站助手快速创建专业网站?
如何快速重置建站主机并恢复默认配置?
如何用VPS主机快速搭建个人网站?
香港服务器如何优化才能显著提升网站加载速度?
全景视频制作网站有哪些,全景图怎么做成网页?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
免费ppt制作网站,有没有值得推荐的免费PPT网站?
如何在建站主机中优化服务器配置?
设计网站制作公司有哪些,制作网页教程?
浅析上传头像示例及其注意事项
如何快速辨别茅台真假?关键步骤解析
建站主机如何选?高性价比方案全解析
建站之星代理费用多少?最新价格详情介绍
建站之星代理平台如何选择最佳方案?
建站之星如何助力企业快速打造五合一网站?
网站设计制作企业有哪些,抖音官网主页怎么设置?
如何在阿里云通过域名搭建网站?
如何在建站之星网店版论坛获取技术支持?
c# 在ASP.NET Core中管理和取消后台任务
如何在阿里云完成域名注册与建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。