Angularjs-Hello

news2025/6/2 23:32:23

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%7D
    at angular.min.js:7:168
    at wc (angular.min.js:101:482)
    at angular.min.js:102:399
    at 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:454
    at 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-server

Did 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:3000
    External: http://10.0.8.10:3000
 ----------------------------------
          UI: http://localhost:3001
 UI 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.coloradmin.cn/o/2394160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 1.0.4

父子shell linux研究的就是shell 打开两个窗口就是两个shell 终端的软件有很多 bash也是一个软件 我们在terminal里面再打开一个bash&#xff0c;然后再次使用ps命令发现多出来一个bash&#xff0c;之后点击exit只是显示了一个exit&#xff0c;这个只是退出了在terminal中打开…

Qt -下载Qt6与OpenCV

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【暂无】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 前言 呃啊&#xff0c;本来就想在 Qt 里简单几个 OpenVC 的函数&#xff0c;没想到一搞就是一天。 我之前的开发环境是 Qt 5.14.2&#xff0c;使用 MinGW 7.3.0 64-bit 编…

机器学习无监督学习sklearn实战一:K-Means 算法聚类对葡萄酒数据集进行聚类分析和可视化( 主成分分析PCA特征降维)

本项目代码在个人github链接&#xff1a;https://github.com/KLWU07/Machine-learning-Project-practice/tree/main/1-Wine%20cluster%20analysis 如果对于聚类算法理论不理解可参考这篇之前文章机器学习中无监督学习方法的聚类&#xff1a;划分式聚类、层次聚类、密度聚类&…

可灵2.1 vs Veo 3:AI视频生成谁更胜一筹?

在Google发布Veo 3几天后,可灵显然感受到了压力,发布了即将推出的视频模型系列可灵 2.1的早期体验版。 据我了解,有三种不同的模式: 可灵 2.1 标准模式: 720p分辨率 仅支持图像转视频(生成更快,一致性更好) 5秒视频仍需20积分 可灵 2.1 专业模式: 1080p分辨率 仅在图…

LLM优化技术——Paged Attention

在Transformer decoding的过程中&#xff0c;需要存储过去tokens的所有Keys和Values&#xff0c;以完成self attention的计算&#xff0c;称之为KV cache。 &#xff08;1&#xff09;KV cache的大小 可以计算存储KV cache所需的内存大小&#xff1a; batch * layers * kv-he…

推荐几个不错的AI入门学习视频

引言&#xff1a;昨天推荐了几本AI入门书&#xff08;AI入门书&#xff09;&#xff0c;反响还不错。今天&#xff0c;我再推荐几个不错的AI学习视频&#xff0c;希望对大家有帮助。 网上关于AI的学习视频特别多。有收费的&#xff0c;也有免费的。我今天只推荐免费的。 我们按…

采用Bright Data+n8n+AI打造自动化新闻助手:每天5分钟实现内容日更

一、引言 在信息爆炸的时代&#xff0c;作为科技领域的内容创作者&#xff0c;我每天都要花费2-3小时手动收集行业新闻、撰写摘要并发布到各个社群。直到我发现Bright Datan8nAI这套"黄金组合"&#xff0c;才真正实现了从"人工搬运"到"智能自动化&qu…

Real SQL Programming

目录 SQL in Real Programs Options Stored Procedures Advantages of Stored Procedures Parameters in PSM SQL in Real Programs We have seen only how SQL is used at the generic query interface --- an environment where we sit at a terminal and ask queries …

Sentinel限流熔断机制实战

1、核心概念 1.1、流量控制 流量控制是为了 防止系统被过多的请求压垮&#xff0c;确保资源合理分配并保持服务的可用性&#xff0c;比如对请求数量的限制。 流量控制的 3 个主要优势&#xff1a; 防止过载&#xff1a;当瞬间涌入的请求量超出系统处理能力时&#xff0c;会…

79. 单词搜索-极致优化,可行性剪枝和顺序剪枝

给你一个目标字符串&#xff0c;和一个二维字符数组&#xff0c;判断在数组中是否能找到目标字符串。 例如&#xff0c;board [["A","B","C","E"],["S","F","C","S"],["A","…

ICDMC 2025:创新媒体模式,迎接数字时代的挑战

2025年数字媒体与通讯国际会议将在风景秀丽的中国山东举行。此次会议致力于促进数字媒体和通讯领域的国际合作与交流&#xff0c;为相关产业发展提供智力支持和技术引领。我们诚挚邀请来自世界各地的学者、研究人员和行业专家参加本次会议&#xff0c;共同探讨前沿问题和发展方…

SoftThinking:让模型学会模糊思考,同时提升准确性和推理速度!!

摘要&#xff1a;人类的认知通常涉及通过抽象、灵活的概念进行思考&#xff0c;而不是严格依赖离散的语言符号。然而&#xff0c;当前的推理模型受到人类语言边界的限制&#xff0c;只能处理代表语义空间中固定点的离散符号嵌入。这种离散性限制了推理模型的表达能力和上限潜力…

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册

晨控CK-UR08与欧姆龙PLC配置Ethernet/IP通讯连接操作手册 晨控CK-UR08系列作为晨控智能工业级别RFID读写器,支持大部分工业协议如RS232、RS485、以太网。支持工业协议Modbus RTU、Modbus TCP、Profinet、EtherNet/lP、EtherCat以及自由协议TCP/IP等。 本期主题&#xff1a;围绕…

开源即战力!从科研到商用:Hello Robot 移动操作机器人Stretch 3多模态传感融合(RGB-D/激光/力矩)控制方案

科研领域对机器人技术的需求日益增长&#xff0c;Hello Robot的移动操作机器人Stretch 3凭借其灵活性和性能满足了这一需求。其模块化设计、开源架构和高精度传感控制能力&#xff0c;使科研人员能够顺利开展实验。Stretch 3以其独特的移动操作能力&#xff0c;为科研探索提供了…

元胞自动机(Cellular Automata, CA)

一、什么是元胞自动机&#xff08;Cellular Automata, CA&#xff09; 元胞自动机&#xff08;CA&#xff09; 是一种基于离散时间、离散空间与规则驱动演化的动力系统&#xff0c;由 冯诺依曼&#xff08;John von Neumann&#xff09; 于1940年代首次提出&#xff0c;用于模…

智能手表单元测试报告(Unit Test Report)

📄 智能手表单元测试报告(Unit Test Report) 项目名称:Aurora Watch S1 模块版本:Firmware v1.0.4 测试阶段:模块开发完成后的单元测试 报告编号:AW-S1-UTR-2025-001 测试负责人:赵磊(软件架构师) 报告日期:2025-xx-xx 一、测试目的 通过对智能手表关键功能模块进…

微深节能 码头装卸船机定位与控制系统 格雷母线

微深节能码头装卸船机定位与控制系统&#xff1a;格雷母线技术赋能港口作业智能化升级 在现代化港口散货装卸作业中&#xff0c;装卸船机是连接船舶与陆域运输的核心枢纽设备。传统装卸船机依赖人工操作&#xff0c;存在定位偏差大、动态协同难、安全风险高等痛点。微深节能基于…

Python实现P-PSO优化算法优化循环神经网络LSTM分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的迅猛发展&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变体LSTM&#xff08;Long S…

Scratch节日 | 龙舟比赛 | 端午节

端午节快乐&#xff01; 这款专为孩子们打造的Scratch游戏——《龙舟比赛》&#xff0c;让你在掌控龙舟的竞速中&#xff0c;沉浸式体验中华传统节日的魅力&#xff01; &#x1f3ae; 游戏亮点 节日氛围浓厚&#xff1a;化身龙舟选手&#xff0c;在波涛汹涌的河流中展开刺激竞…

electron开发百度桌面应用demo及如何打包应用

1.开发入口文件main.js 1-1 加载百度URL const { app, BrowserWindow, nativeImage } require(electron) const path require(node:path)const createWindow () > {const win new BrowserWindow({width: 800,height: 600,})//加载百度URLwin.loadURL(https://www.baid…