全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

初学 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小时内与您取得联系。