Angularjs-Hello

article/2025/6/22 23:09:44

1 关于Angularjs

最近因为项目需要又要做这个,所以简单复习下。其实这个大概7,8年前就用过,当时做了几个简单页面觉得太简单就还是回去做嵌入式了。按照互联网技术的进化速度,本来以为早死在 沙滩上了,没想到现在还在坚持。据说是google在后面支持,有这么强的亲爹,难怪能撑这么久。

之前用Angular是因为说的可以跨平台,也不知道现在还有没有。先还是对比一下现在流行的几个前端框架。

核心特性对比

框架React (Meta)Vue (尤雨溪)Angular (Google)Svelte (Rich Harris)
类型库(需搭配生态)渐进式框架全功能企业级框架编译时框架
语言JavaScript/JSXJavaScript/TypeScriptTypeScriptJavaScript/Svelte语法
数据流单向(Props + State)双向绑定(v-model)双向绑定 + RxJS响应式变量
DOM 更新虚拟DOM Diff虚拟DOM + 精确更新变更检测(Zone.js)编译为原生JS
学习曲线中等极低

对了,这里有两个版本。AngularJS(1.x)是旧版,Angular(2+)是全新框架,两者不兼容。

学习资料

AngularJS官方文档:AngularJS

AngularJS官方指南:AngularJS

AngularJS源码:GitHub - angular/angular.js: AngularJS - HTML enhanced for web apps!

=================================================

Angular官方文档: Angular

Angular快速手册:Angular

2 搭配Springboot的一个简单实现

 SpringBoot简单体验(TODO)-CSDN博客

之前的SpringBoot是直接print,没法直接对接前端,所以现在要改成前后端的实现。

前后端的实现目前有两种,一种是完全集成到一起,还有一种是分开,只留API接口。貌似第二种更流行,所以也只看第二种。

+-------------------+          HTTP Requests          +-------------------+
|                              | ------------------------------> |                             |
|  AngularJS Front  |          (API Calls)             | Spring Boot API   |
|  (Port: 3000)         | <------------------------------ | (Port: 8081)         |
|                              |         JSON Responses  |                              |
+-------------------+                                             +-------------------+

2.1 SpringBoot的改造

其实东西也不多。第一个是输出改成json。否则前端无法解析会报错。

angular.min.js:129 Error: [$http:baddata] http://errors.angularjs.org/1.8.3/$http/baddata?p0=Hello%20from%20Spring%20Boot!&p1=%7B%7Dat angular.min.js:7:168at wc (angular.min.js:101:482)at angular.min.js:102:399at r (angular.min.js:8:76)at Bd (angular.min.js:102:381)at f (angular.min.js:104:472)at angular.min.js:141:454at m.$digest (angular.min.js:153:67)at m.$apply (angular.min.js:156:484)at k (angular.min.js:107:445) 'Possibly unhandled rejection: {}'

还有一个就是跨域。之前听说了好几次,今天看了一下原来就是浏览器本身的一个安全限制。

协议(protocol) 例如 http vs https  
域名(host)     例如 localhost vs example.com  
端口(port)     例如 3000 vs 8080

以上三个有一个不同,就算是跨域,要在代码中指定。

比如:

前端页面地址请求的接口地址是否跨域
http://localhost:3000http://localhost:8080/api/data✅ 跨域
http://example.comhttps://example.com/api/data✅ 跨域
http://localhost:8080http://localhost:8080/api/data❌ 同源

综合上面两点,将之前的hello函数改成这个即可。

    @CrossOrigin(origins = "*")@GetMapping("/hello")public Map<String, String> hello() {Map<String, String> response = new HashMap<>();response.put("message", "Hello from Spring Boot!");return response;}

2.2 AngularJS

前几天和前端的哥们配合,看了一下他们的操作,全是npm。好吧,我也这样玩。npm就是node.js的工具。要先安装一下。

至于代码,看了一下,核心就是index.html,app/main.js,package.json

package.json是用在npm环境中的,配置了就可以自动下载需要依赖的库。我这边的如下:

ubuntu@VM-8-10-ubuntu:~/web3$ cat package.json
{"name": "angularjs-frontend","version": "1.0.0","description": "AngularJS frontend example","main": "index.html","scripts": {"start": "lite-server"},"dependencies": {"angular": "^1.8.2"},"devDependencies": {"lite-server": "^2.6.1"}
}

 index.html如下 

<!DOCTYPE html>
<html ng-app="helloApp">
<head><meta charset="UTF-8"><title>AngularJS Frontend</title><script src="node_modules/angular/angular.min.js"></script><script src="app/main.js"></script>
</head>
<body ng-controller="HelloController"><h1>{{ message }}</h1>
</body>
</html>

app/main.js如下 

var app = angular.module('helloApp', []);
app.controller('HelloController', function($scope, $http) {$http.get("http://XXXXX:8081/hello").then(function(resp) {$scope.message = resp.data;});
});

之后就是两个命令

npm install 
npm start

 npm  install会下载依赖,同时会塞很多东西到node_modules。

之后就是npm start。

ubuntu@VM-8-10-ubuntu:~/web3$ npm start> angularjs-frontend@1.0.0 start
> lite-serverDid not detect a `bs-config.json` or `bs-config.js` override file. Using lite-server defaults...
** browser-sync config **
{injectChanges: false,files: [ './**/*.{html,htm,css,js}' ],watchOptions: { ignored: 'node_modules' },server: { baseDir: './', middleware: [ [Function], [Function] ] }
}
[Browsersync] Access URLs:----------------------------------Local: http://localhost:3000External: http://10.0.8.10:3000----------------------------------UI: http://localhost:3001UI External: http://localhost:3001----------------------------------
[Browsersync] Serving files from: ./
[Browsersync] Watching files...
25.05.31 13:07:02 304 GET /index.html
25.05.31 13:07:02 304 GET /node_modules/angular/angular.min.js
25.05.31 13:07:02 304 GET /app/main.js
[Browsersync] Couldn't open browser (if you are using BrowserSync in a headless environment, you might want to set the open option to false)

最后就很简单了。直接访问3000端口:http://XXX.XXX.99.181:3000/

3 高级特性

 后面再玩点高级特性,先TODO。。。

3.1 前端路由

说实话,听到这个词有点诧异,因为我是做过路由器,路由这个词一般用在网络中。前端为什么会用到路由,查了一下,原来是单页应用(Single page web application)。其实本质就是将一些页面直接缓存到浏览器,需要的时候有前端控制调用,往后台只获取API接口数据。。。这样大大加快了速度。。。好吧,现在的浏览器确实玩的花。

场景传统多页应用单页应用(SPA)
页面切换每次请求服务器获取完整 HTML从缓存读取模板,仅 API 请求数据
模板存储每次从服务器加载首次加载时打包进 JS
用户体验刷新页面,速度较慢无刷新,快速切换

关键实现。

1 浏览器地址换成http://example.com/#!/home

<a href="#!/home">主页</a> <!-- 使用了 hashbang 模式 -->

这个表示跳转不由浏览器控制,由Angular控制。

2 路由函数?

就是处理发过来的#!/home,转成页面加载。第一次还是会发送异步请求去加载,后续就直接使用浏览器中的缓存。

app.config(function($routeProvider) {$routeProvider.when('/home', {templateUrl: 'views/home.html',controller: 'HomeCtrl'})...
});

3.2 指令(Directives)

自定义组件

app.directive('fileUploader', function() {return {restrict: 'E',scope: {onUpload: '&'},template: `<input type="file" /><button ng-click="upload()">Upload</button>`,link: function(scope, element) {var fileInput = element.find('input')[0];scope.upload = function() {var file = fileInput.files[0];if (file) {scope.onUpload({ file: file });}};}};
});

 后面可以直接在html中使用。

<file-uploader on-upload="uploadFile(file)"></file-uploader>

支持以下扩展指令:

类型示例说明
元素指令<my-widget></my-widget>创建自定义 HTML 元素
属性指令<div my-attr></div>扩展元素行为
类名指令<div class="my-dir"></div>通过 CSS 类触发
注释指令<!-- directive: my-dir -->较少使用

常见内置指令:

指令用途
ng-model双向数据绑定
ng-repeat循环渲染
ng-show/ng-hide显示/隐藏元素
ng-class动态 CSS 类
ng-click点击事件处理
ng-if条件渲染
ng-switch多条件切换
ng-include动态加载模板

3.3 双向数据绑定

index.html

<!DOCTYPE html>
<html ng-app="demoApp">
<head><meta charset="UTF-8"><title>AngularJS双向绑定示例</title><script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.8.2/angular.min.js"></script><style>body { font-family: Arial; padding: 20px; }.demo-box { border: 1px solid #ddd; padding: 20px; margin: 10px 0;border-radius: 5px;}input, select { padding: 8px; margin: 5px 0; width: 100%;box-sizing: border-box;}.output { background: #f0f8ff; padding: 10px; margin-top: 10px;}</style>
</head>
<body><h1>AngularJS 双向数据绑定演示</h1><div ng-controller="DemoController"><!-- 示例1: 文本输入绑定 --><div class="demo-box"><h3>1. 文本同步</h3><input type="text" ng-model="userInput" placeholder="输入任意内容"><div class="output"><p>实时显示: <strong>{{ userInput || "(暂无输入)" }}</strong></p><p>字符数: {{ userInput.length }}</p></div></div><!-- 示例2: 复选框绑定 --><div class="demo-box"><h3>2. 复选框状态</h3><label><input type="checkbox" ng-model="isAgreed"> 我同意条款</label><div class="output">当前状态: <span style="color: {{ isAgreed ? 'green' : 'red' }};">{{ isAgreed ? "已同意" : "未同意" }}</span></div></div><!-- 示例3: 下拉选择绑定 --><div class="demo-box"><h3>3. 下拉选择</h3><select ng-model="selectedFruit" ng-options="fruit for fruit in fruits"><option value="">-- 选择水果 --</option></select><div class="output" ng-if="selectedFruit">您选择的是: <strong>{{ selectedFruit }}</strong><img ng-src="images/{{ selectedFruit }}.png" alt="{{ selectedFruit }}" style="height: 50px; display: block; margin-top: 10px;"></div></div></div><script>angular.module('demoApp', []).controller('DemoController', function($scope) {// 初始化模型数据$scope.userInput = "";$scope.isAgreed = false;$scope.fruits = ['苹果', '香蕉', '橙子', '葡萄'];$scope.selectedFruit = "";});</script>
</body>
</html>

用的话还是很简单,就是一个ng-model。

作用就是用户在界面上改了,对应的程序变量也自动改了,不用手动去写赋值函数。而程序中的变量改了,自动在界面显示上改变。

3.4 依赖注入(DI)

// 自定义服务
app.service('MyLogger', function() {this.log = function(msg) {console.log("MyLogger:", msg);};
});// 控制器中使用
app.controller('MyCtrl', function($scope, MyLogger, $http) {MyLogger.log("控制器启动");$http.get('/api/data').then(function(response) {$scope.data = response.data;});
});

好像就是预制很多类或者说服务?直接逮来用就完事?

AngularJS 内部有一个 依赖容器(Injector),它做了两件事:

  1. 提前注册好了很多服务(比如 $http$scope$timeout 等);

  2. 当你写控制器、服务、指令等组件时,只要声明需要什么,AngularJS 就自动传入这些依赖。


http://www.hkcw.cn/article/ckEpqNKreh.shtml

相关文章

红外遥控(外部中断)

目录 1.红外遥控简介 通信方式&#xff1a; 红外LED波长&#xff1a; 通信协议标准&#xff1a; 2.硬件电路 发送部分1&#xff1a; 内部元件介绍&#xff1a; 工作原理&#xff1a; 为什么要以38KHZ亮灭&#xff1f; 电路图&#xff1a; 发送部分2&#xff1a; 电…

leetcode hot100刷题日记——33.二叉树的层序遍历

解题总结二维vector的初始化方法 题目描述情况1&#xff1a;不确定行数和列数情况2&#xff1a;已知行数和列数情况3&#xff1a;已知行数但不知道列数情况4&#xff1a;已知列数但不知道行数 题目描述 解答&#xff1a;用队列 思路都差不多&#xff0c;我觉得对于我自己来说&a…

GitToolBox 插件安装与配置指南

GitToolBox 插件安装与配置指南 GitToolBox GitToolBox IntelliJ plugin 项目地址: https://gitcode.com/gh_mirrors/gi/GitToolBox 1. 项目基础介绍和主要编程语言 项目基础介绍 GitToolBox 是一个专为 JetBrains 家族 IDE&#xff08;如 IntelliJ IDEA、PyCharm 等&…

开源模型应用落地-qwen模型小试-Qwen3-8B-推理加速-vLLM-结构化输出(三)

一、前言 在人工智能技术迅猛发展的今天,高效推理框架与强大语言模型的结合正不断突破应用边界。vLLM作为新一代高性能推理引擎,凭借其创新的PagedAttention技术和内存优化能力,为大规模语言模型部署提供了全新可能。 本文将聚焦vLLM框架与QWen3-8B这一国产开源大模型的深度…

史上最全 Git 图文教程(非常详细)零基础入门到精通,收藏这一篇就够了

戳上方蓝字“Java知音”关注我 Git安装 安装 1.先去官网下载这个软件, 准备安装到本电脑中 https://git-scm.com/ 2.根据自己电脑系统下载此软件到本机 Windows 系统直接下载 .exe 文件即可&#xff0c;macOS 系统使用 Homebrew 命令行安装&#xff0c;终端输入 git --versi…

GitHub学生认证申请

想要免费使用Copilot&#xff0c;申请学生认证可以免费使用。在申请过程中&#xff0c;踩了些坑。记录一下供大家参考 认证有效期 默认时长&#xff1a;首次认证成功后&#xff0c;学生权益&#xff08;如 GitHub Pro 权限和 Student Developer Pack&#xff09;的有效期一般为…

最新Spring Security实战教程(十五)快速集成 GitHub 与 Gitee 的社交登录

&#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Micro麦可乐的博客 &#x1f425;《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程&#xff0c;入门到实战 &#x1f33a;《RabbitMQ》…

Vue3 开源UI 框架推荐 (总有一款适合你)

一 、前言 &#x1f4a5;这篇文章主要推荐了支持 Vue3 的开源 UI 框架&#xff0c;包括 web 端和移动端的多个框架&#xff0c;如 Element-Plus、Ant Design Vue 等 web 端框架&#xff0c;以及 Vant、NutUI 等移动端框架&#xff0c;并分别介绍了它们的特性和资源地址。&#…

Java 版 Manus 实现来了,Spring AI Alibaba 发布开源 OpenManus 实现

大家好&#xff0c;我是玄姐。 此次官方发布的 Spring AI Alibaba OpenManus 实现&#xff0c;涵盖了完整的多智能体任务规划、思考与执行流程。这一版本专为 Java 开发者设计&#xff0c;能够让开发者亲身体验多智能体协同工作的强大效果。它具备根据用户问题进行深度分析、操…

Linux之基础开发工具二(makefile,git,gdb)

目录 一、自动化构建-make/makefile 1.1、背景 1.2、基本使用 1.3、推导过程 1.4、语法拓展 二、进度条小程序 2.1、回车与换行 2.2、行缓冲区 2.3、练手-倒计时程序 2.4、进度条程序 三、版本控制器-Git 3.1、版本控制器 3.2、gitee的使用 3.2.1、如何创建仓库 …

如何使用gitee进行代码管理(常见的两种私人令牌-HTTPS和公钥SSH)

Getee平台提供了四种方式管理代码&#xff0c;如下图所示&#xff1a; 一、使用私人令牌&#xff08;HTTPS&#xff09;管理代码 优点&#xff1a;账户下所有项目都可以操作&#xff0c;并且使用快捷&#xff0c;过程简单&#xff0c;可以选择令牌的权限范围&#xff0c;HTTPS…

@PathVariable注解-补充

这段代码是 Spring MVC 框架中使用 RESTful 风格的请求处理方法&#xff0c;详细解释其功能和注解&#xff1a; 代码功能概述 这段 Java 代码定义了一个 Spring MVC 控制器方法&#xff0c;用于处理 RESTful 风格的 URL 请求。它可以从 URL 路径中提取参数&#xff0c;并将这…

Canvas实例篇:十二星座之天秤座

Canvas实例篇&#xff1a;十二星座之天秤座 前言效果预览代码实现代码说明星座特定星 结语 前言 星座总给人浪漫而神秘的感觉&#xff0c;如何用代码还原星空中的浪漫&#xff1f;本文将通过 Canvas 技术&#xff0c;讲述如何实现一个可交互的天秤座星空图&#xff0c;包含星星…

VIP》》IP地址漂移

IP地址漂移&#xff0c;就是一个虚拟的IP地址&#xff0c;能够在不同的物理服务器或网络接口之家来回转换&#xff0c;所以当你或者其他的网络设备跟这个虚拟IP地址连接的时候&#xff0c;并不会察觉到设备的转换。这对于网络流量调度&#xff0c;服务器负载均衡的使用意义重大…

【C语言】讲解 程序分配的区域(新手)

目录 代码区 数据区 堆区 栈区 常量区 重点比较一下堆区与 栈区 总结&#xff1a; 前言&#xff1a; C语言程序的内存分配区域是理解其运行机制的重要部分。根据提供的多条证据&#xff0c;我们可以总结出C语言程序在运行时主要涉及以下五个关键内存区域&#xff1a; 代…

时间序列预测入门喂饭教程,python代码示例

目录 前言一、基本原理1、啥是时间序列&#xff1f;2、预测前的准备什么材料&#xff1f;3、搭建你的预测工具&#xff08;模型&#xff09; 二、建模模拟实战&#xff1a;用Python搭个简单模型**Step 1&#xff1a;先把需要的工具库准备好****Step 2&#xff1a;生成一组模拟的…

BLE 广播与扫描机制详解:如何让设备“被看见”?

在 BLE 通信中,“广播”是设备展示自己的方式,“扫描”是发现外设的入口。 作为 BLE 协议的核心机制之一,广播与扫描的设计直接影响通信的稳定性、功耗与连接效率。本篇将从 BLE 广播/扫描原理、数据结构、事件流程到调试技巧全面展开,配合实战案例深入讲解 BLE 设备“可被…

小程序使用npm包的方法

有用的链接 npm init -y 这个命令很重要, 会初始化 package.json 再重新打开微信小程序开发工具 选择工具中npm构建 在程序中引用时在main.js中直接使用包名的方式引用即可 如安装的是generator包&#xff0c;npm构建后就会生成 const myPackage require(***-generato…

Java 单例模式详解

目录 1. 饿汉式&#xff08;Eager Initialization&#xff09; 2. 懒汉式&#xff08;Lazy Initialization&#xff09; 3. 懒汉式 同步锁&#xff08;线程安全&#xff09; 4. 双重检查锁&#xff08;Double-Checked Locking&#xff09; 5. 静态内部类&#xff08;推荐…

大模型应用开发之预训练

预训练是研发大语言模型的第一个训练阶段&#xff0c;通过在大规模语料上进行预训练&#xff0c;大语言模型可以获得通用的语言理解与生成能力&#xff0c;掌握较为广泛的世界知识&#xff0c;具备解决众多下游任务的性能潜力 一、数据预处理 1. 数据的收集 1&#xff09;通…