详解angularjs的数组传参方式的简单实现


Posted in Javascript onJuly 28, 2017

初学 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());
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript实现动态菜单添加的实例代码
Jul 05 Javascript
JQuery限制复选框checkbox可选中个数的方法
Apr 20 Javascript
javascript实现链接单选效果的方法
May 13 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
Oct 14 Javascript
基于Jquery插件实现跨域异步上传文件功能
Apr 26 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
May 07 Javascript
jQuery基础知识点总结(必看)
May 31 Javascript
JavaScript 控制字体大小设置的方法
Nov 23 Javascript
JavaScript Uploadify文件上传实例
Feb 28 Javascript
AngularJS 中ui-view传参的实例详解
Aug 25 Javascript
vue-router传递参数的几种方式实例详解
Nov 13 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
js 获取html5的data属性实现方法
Jul 28 #Javascript
jQuery获取table表中的td标签(实例讲解)
Jul 28 #jQuery
浅谈JS中的常用选择器及属性、方法的调用
Jul 28 #Javascript
js原生代码实现轮播图的实例讲解
Jul 28 #Javascript
js弹性势能动画之抛物线运动实例详解
Jul 27 #Javascript
js学习总结之dom2级事件基础知识详解
Jul 27 #Javascript
Angular指令之restict匹配模式的详解
Jul 27 #Javascript
You might like
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
Laravel5.* 打印出执行的sql语句的方法
2017/07/24 PHP
PHP实现简单登录界面
2019/10/23 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
JavaScript的内存释放问题详解
2015/01/21 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
js变形金刚文字特效代码分享
2015/08/20 Javascript
JQuery和PHP结合实现动态进度条上传显示
2016/11/23 Javascript
小程序分享模块超级详解(推荐)
2019/04/10 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
[57:18]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#3VP VS VG
2016/03/03 DOTA
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
python字符串连接方法分析
2016/04/12 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
分析python切片原理和方法
2017/12/19 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python实现两个经纬度点之间的距离和方位角的方法
2019/07/05 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
母亲80寿诞答谢词
2014/01/16 职场文书
企业理念标语
2014/06/09 职场文书
2014企业领导班子四风对照检查材料思想汇报
2014/09/17 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
一年级小学生评语大全
2014/12/25 职场文书
单位病假条范文
2015/08/17 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
Python Matplotlib绘制动画的代码详解
2022/05/30 Python