当前位置: 首页 > article >正文

AngularJS 控制器

AngularJS 控制器 (Controller) 学习笔记控制器是 AngularJS 应用的核心组件之一负责初始化应用状态、定义行为逻辑并作为视图HTML和模型Scope之间的桥梁。一、控制器的基本概念1. 什么是控制器定义JavaScript 构造函数用于初始化$scope对象。作用设置初始状态数据。定义行为方法。响应视图中的用户交互。生命周期当 AngularJS 遇到ng-controller指令时创建当 DOM 元素被销毁时销毁。2. 定义控制器的两种方式方式 A全局注册推荐用于简单应用varappangular.module(myApp,[]);// 定义控制器app.controller(MyController,function($scope,$http){$scope.messageHello World;$scope.users[];// 方法$scope.addUserfunction(name){$scope.users.push({name:name});};});方式 B模块内匿名定义不推荐难以测试angular.module(myApp,[]).controller(MyController,function($scope){$scope.dataTest;});二、控制器语法风格1.$scope语法传统app.controller(UserCtrl,function($scope,$http){$scope.user{name:John,age:25};$scope.savefunction(){$http.post(/api/save,$scope.user);};});优点简单直观适合小型应用。缺点容易混淆$scope和this在嵌套作用域中容易出错。2.ControllerAs语法推荐AngularJS 1.3app.controller(UserCtrl,function($http){varvmthis;// 使用 vm (ViewModel) 作为 this 的别名vm.user{name:John,age:25};vm.savefunction(){$http.post(/api/save,vm.user);};});!-- 视图中使用 --divng-controllerUserCtrl as userCtrlinputng-modeluserCtrl.user.namebuttonng-clickuserCtrl.save()保存/button/div优点避免原型继承陷阱。代码更清晰易于阅读和维护。便于单元测试不依赖$scope。支持 ES6 Class 语法。3. 混合使用不推荐// ❌ 避免混用app.controller(BadCtrl,function($scope){this.dataBad;$scope.otherWorse;});三、依赖注入 (Dependency Injection)控制器通过依赖注入获取服务Services、过滤器Filters等。1. 隐式注入不推荐压缩后失效app.controller(MyCtrl,function($scope,$http){...});// 压缩后变成 function(a, b) { ... }Angular 无法识别参数名2. 数组注解法推荐生产环境标准app.controller(MyCtrl,[$scope,$http,function($scope,$http){// 逻辑代码}]);3. 显式$inject属性推荐代码整洁functionMyCtrl($scope,$http){// 逻辑代码}MyCtrl.$inject[$scope,$http];app.controller(MyCtrl,MyCtrl);四、控制器的作用域与继承1. 作用域链控制器创建一个新的$scope对象。子控制器继承父控制器的$scope原型链继承。注意在子 Scope 中修改对象属性是安全的但修改原始类型字符串、数字会创建新属性破坏继承链。// 父控制器app.controller(ParentCtrl,function($scope){$scope.data{value:10};// 对象$scope.count5;// 原始类型});// 子控制器app.controller(ChildCtrl,function($scope){$scope.data.value20;// ✅ 修改对象属性影响父级$scope.count10;// ❌ 创建新属性不影响父级});2. 隔离作用域指令中指令可以使用scope: {}创建隔离作用域不继承父控制器。控制器通常不直接创建隔离作用域而是通过指令实现。五、控制器生命周期钩子AngularJS 控制器没有像 Vue 那样的显式生命周期钩子但可以通过以下方式模拟1. 初始化逻辑直接在构造函数中执行。app.controller(InitCtrl,function($scope,$http){// 初始化$scope.loadDatafunction(){$http.get(/api/data).then(function(response){$scope.dataresponse.data;});};// 立即执行$scope.loadData();});2. 销毁钩子监听$destroy事件。app.controller(DestroyCtrl,function($scope){$scope.$on($destroy,function(){// 清理定时器、事件监听器等console.log(控制器销毁);});});六、控制器通信方式1. 父子控制器通信父传子通过$scope属性绑定。子传父通过$scope.$emit或回调函数。// 父控制器app.controller(ParentCtrl,function($scope){$scope.parentDataParent;$scope.onChildEventfunction(data){console.log(收到子级事件:,data);};});// 子控制器app.controller(ChildCtrl,function($scope){$scope.sendToParentfunction(){$scope.$emit(childEvent,Hello Parent);};$scope.$on(childEvent,function(event,data){$scope.parentDatadata;// 注意这里需要处理作用域});});2. 兄弟控制器通信通过$rootScope或共享服务Service。推荐使用 Service 作为单例共享数据。// 共享服务app.service(SharedService,function(){this.dataShared Data;this.updateDatafunction(newData){this.datanewData;};});// 控制器 Aapp.controller(CtrlA,function($scope,SharedService){$scope.updatefunction(){SharedService.updateData(New Data);};});// 控制器 Bapp.controller(CtrlB,function($scope,SharedService){$scope.$watch(function(){returnSharedService.data;},function(newVal){$scope.sharedDatanewVal;});});七、最佳实践1. 保持控制器轻量控制器只负责视图逻辑。业务逻辑、数据访问放入Service。DOM 操作放入Directive。// ❌ 糟糕的控制器app.controller(BadCtrl,function($scope,$http){$scope.fetchDatafunction(){// 复杂的业务逻辑// 直接操作 DOMdocument.getElementById(div).style.colorred;};});// ✅ 优秀的控制器app.controller(GoodCtrl,function($scope,DataService){$scope.data[];$scope.fetchDatafunction(){DataService.getData().then(function(result){$scope.dataresult;});};});2. 使用ControllerAs语法提高代码可读性。避免$scope陷阱。便于测试。3. 避免在控制器中直接操作 DOM使用ng-class,ng-style,ng-show等指令。复杂 DOM 操作使用Directive。4. 错误处理app.controller(ErrorCtrl,function($scope,$http){$scope.fetchDatafunction(){$http.get(/api/data).then(function(response){$scope.dataresponse.data;}).catch(function(error){$scope.error加载失败: error.message;});};});5. 内存泄漏预防在$destroy事件中清理定时器、事件监听器。$scope.$on($destroy,function(){clearInterval($scope.timer);$scope.$off(customEvent);});八、常见陷阱与解决方案问题原因解决方案数据不更新异步回调中未触发$apply使用$timeout或$scope.$apply()原型继承污染直接修改原始类型属性使用对象包裹数据 ($scope.data {})控制器重复初始化指令重复使用ng-controller检查 HTML 结构避免嵌套重复内存泄漏未清理定时器或事件监听在$destroy事件中清理测试困难依赖$scope隐式注入使用ControllerAs 数组注解法九、总结AngularJS 控制器的核心要点职责单一只处理视图逻辑业务逻辑交给 Service。语法选择优先使用ControllerAs语法避免$scope陷阱。依赖注入使用数组注解法或$inject属性确保代码可压缩。通信机制父子通过$scope兄弟通过 Service 或$rootScope。生命周期利用$destroy事件清理资源防止内存泄漏。测试友好保持控制器轻量便于单元测试。通过遵循这些最佳实践可以构建出结构清晰、易于维护的 AngularJS 应用。

相关文章:

AngularJS 控制器

AngularJS 控制器 (Controller) 学习笔记 控制器是 AngularJS 应用的核心组件之一,负责初始化应用状态、定义行为逻辑,并作为视图(HTML)和模型(Scope)之间的桥梁。 一、控制器的基本概念 1. 什么是控制器…...

从单体到微服务:如何用Spring Cloud构建高可用医院信息系统HIS

从单体到微服务:如何用Spring Cloud构建高可用医院信息系统HIS 【免费下载链接】HIS HIS英文全称 hospital information system(医疗信息就诊系统),系统主要功能按照数据流量、流向及处理过程分为临床诊疗、药品管理、财务管理、患…...

生产环境mysql如何实现高可用_配置主从复制与自动故障切换

主从复制SHOW SLAVE STATUS显示Connecting的常见原因是网络通但权限或配置未对齐:主库需开启binlog且server_id全局唯一;从库CHANGE MASTER TO中MASTER_HOST不能为localhost或127.0.0.1,须填真实IP或域名。主从复制配不起来,SHOW …...

从混乱到有序:NSC_BUILDER 让你的 Switch 游戏库焕然一新

从混乱到有序:NSC_BUILDER 让你的 Switch 游戏库焕然一新 【免费下载链接】NSC_BUILDER Nintendo Switch Cleaner and Builder. A batchfile, python and html script based in hacbuild and Nuts python libraries. Designed initially to erase titlerights encry…...

da da wda d

da w d w...

c++怎么读取大端序设备的固件bin文件_字节反转与位移操作【详解】

...

暗黑破坏神2重生记:用d2dx让20年老游戏焕发现代光彩

暗黑破坏神2重生记:用d2dx让20年老游戏焕发现代光彩 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 还在为经典《…...

KMS激活终极指南:5分钟搞定Windows和Office永久激活难题

KMS激活终极指南:5分钟搞定Windows和Office永久激活难题 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾因Windows系统未激活而烦恼?是否因为Office办公软件弹出…...

计算机毕业设计:Python农业粮食产量与气候预测平台 Django框架 数据分析 可视化 机器学习 深度学习 大数据 大模型(建议收藏)✅

博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

NCMconverter完整指南:3步解锁加密音乐文件的终极播放方案

NCMconverter完整指南:3步解锁加密音乐文件的终极播放方案 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 你是否曾经遇到过这样的情况:从音乐平台下载了…...

渗透基础知识ctfshow——Web应用安全与防护(第六 七章)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录混合型XSSXSS 练习(反射型)**绕过方法**新增知识:平台外带xss编码绕过XSS过滤绕过方法请求伪造漏洞_CSRF绕过方法最简单的SSRFSSR…...

如何简化多表关联SQL逻辑_利用视图封装复杂JOIN操作

PHP队列消费进程卡住需先检查pcntl_fork是否被禁用;AI请求须设硬超时;Redis队列应使用BRPOPLPUSH防消息丢失;systemd需调大MemoryLimit和RestartSec。PHP队列消费进程卡住不动?先查pcntl_fork是否被禁用很多线上环境(尤…...

部署本地AI大模型--ollma

下载链接: 1.官网:在Windows上下载《Ollama 2.github:Release v0.21.0 ollama/ollama 前言:为什么选择 Ollama Ollama 是一款专为本地运行大模型打造的开源工具,它把复杂的环境配置、依赖管理和模型量化过程都封装…...

3步完成微信聊天记录备份:WeChatExporter终极免费教程

3步完成微信聊天记录备份:WeChatExporter终极免费教程 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter WeChatExporter是一款免费开源的微信聊天记录导出工具&…...

终极网盘直链下载助手完整指南:如何一键获取八大网盘真实下载地址

终极网盘直链下载助手完整指南:如何一键获取八大网盘真实下载地址 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动…...

5步深度解析:ComfyUI-SUPIR图像超分辨率实战指南

5步深度解析:ComfyUI-SUPIR图像超分辨率实战指南 【免费下载链接】ComfyUI-SUPIR SUPIR upscaling wrapper for ComfyUI 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-SUPIR ComfyUI-SUPIR是ComfyUI生态中一款基于扩散模型的专业级图像超分辨率插件…...

TranslucentTB开机自启动失效:Windows启动机制深度解析与系统级解决方案

TranslucentTB开机自启动失效:Windows启动机制深度解析与系统级解决方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB Wind…...

如何让AMD/Intel显卡免费获得CUDA加速:ZLUDA兼容层完整指南

如何让AMD/Intel显卡免费获得CUDA加速:ZLUDA兼容层完整指南 【免费下载链接】ZLUDA CUDA on non-NVIDIA GPUs 项目地址: https://gitcode.com/GitHub_Trending/zl/ZLUDA 你是否曾因没有昂贵的NVIDIA显卡而无法运行深度学习项目?当同事们在讨论CUD…...

英雄联盟国服皮肤定制终极指南:R3nzSkin技术深度解析与安全实践

英雄联盟国服皮肤定制终极指南:R3nzSkin技术深度解析与安全实践 【免费下载链接】R3nzSkin-For-China-Server Skin changer for League of Legends (LOL) 项目地址: https://gitcode.com/gh_mirrors/r3/R3nzSkin-For-China-Server R3nzSkin国服特供版是专为中…...

在WSL2 Ubuntu 20.04上编译安装QEMU 6.2.0:一份详细的依赖清单与避坑指南

在WSL2 Ubuntu 20.04上编译安装QEMU 6.2.0:一份详细的依赖清单与避坑指南 对于需要在Windows环境下进行嵌入式或系统开发的工程师来说,WSL2提供了一个近乎原生的Linux开发环境。而QEMU作为一款功能强大的开源模拟器,能够模拟多种硬件架构&…...

避坑指南:Mac+PyCharm安装PyQt5-tools时,解决‘pyuic5路径找不到’和‘Qt Designer打不开’的常见问题

Mac开发者必看:PyQt5环境配置疑难问题全解析 在Mac平台上使用PyCharm进行Python GUI开发时,PyQt5无疑是最受欢迎的选择之一。然而,从安装到配置的完整流程中,开发者常常会遇到各种"坑",特别是对于刚接触Qt框…...

告别Appium!用Python的uiautomator2+weditor 0.6.4搞定安卓自动化测试(附编码避坑指南)

轻量化安卓自动化测试:Python uiautomator2与weditor实战指南 在移动应用测试领域,Appium曾长期占据主导地位,但其复杂的配置环境让不少开发者望而却步。如今,基于Python的uiautomator2与weditor组合提供了一种更轻量、更高效的替…...

Playwright爬虫进阶:如何用`page.route`拦截请求、模拟登录并高效监听API数据?

Playwright爬虫进阶:如何用page.route拦截请求、模拟登录并高效监听API数据? 现代Web应用越来越依赖动态数据加载和复杂的反爬机制,传统的爬虫技术往往难以应对。Playwright作为一款强大的浏览器自动化工具,提供了丰富的API来模拟…...

C++如何实现YAML配置文件的自动备份_文件流操作用法【实战】

YAML配置备份必须用std::filesystem::copy并指定overwrite_existing选项,配合exists预检和try/catch捕获filesystem_error;命名需含时间戳与原扩展名,路径用std::filesystem::path,逻辑须独立于YAML加载。YAML配置文件备份必须用s…...

SQL中如何获取所有列的数据:SELECT -星号用法与性能影响

能用但多数时候不该用——它会解析全部列元数据、传输冗余字段、阻碍执行计划优化,易引发列名冲突、ORM映射错乱等问题,仅限调试或结构极小稳定时使用。SELECT * 在真实查询中到底能不能用能用,但多数时候不该用——不是语法错误,…...

告别Win10黑屏卡顿:深度排查Explorer.exe高CPU占用与启动失败的关联问题

深度解析Windows 10黑屏与Explorer高CPU占用的关联排查指南 你是否经历过这样的场景:Windows 10系统运行越来越慢,任务管理器显示Explorer.exe进程CPU占用率居高不下,最终在某次重启后直接陷入黑屏状态?这看似两个独立的问题——性…...

如何保证MongoDB文档的数据质量_JSON Schema验证规则配置

MongoDB 5.0 启用 JSON Schema 验证需显式配置 validator、validationLevel(推荐 strict)和 validationAction(建议先设 warn);schema 不自动映射 ObjectId/Date,需正则或 format 校验;嵌套字段…...

Navicat导出Excel表格数据为空如何解决_过滤条件与权限排查

...

微信消息自动转发终极指南:如何实现多群消息智能同步的完整教程

微信消息自动转发终极指南:如何实现多群消息智能同步的完整教程 【免费下载链接】wechat-forwarding 在微信群之间转发消息 项目地址: https://gitcode.com/gh_mirrors/we/wechat-forwarding 你是否曾经因为需要在多个微信群之间反复转发相同的信息而感到疲惫…...

浪潮NF5280M6服务器上ESXi 6.7双网卡聚合实战:从交换机LACP到ESXi IP哈希的完整避坑指南

浪潮NF5280M6服务器ESXi 6.7双网卡聚合实战:从交换机配置到主机调优的全链路解析 当两台Intel X710光纤网卡在浪潮NF5280M6服务器机箱里闪烁绿灯时,大多数运维工程师可能不会想到,这个看似标准的硬件组合会在LACP聚合配置中引发持续数小时的网…...