详解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碰撞运动实现方法详解