使用 Angular

N。正如上个月提到的,现在可以开始处理 MEAN 堆栈的前端。也就是说,我们将深入探究 Angular。自本文撰写之时起(可能在今后的几年间),我们都会面临一个问题,即 Angular 存在某种版本问题。


Angular 多年来一直是单页面应用程序领域的主流产品。不过,在不断发展的过程中,Angular 已成为一种不同的体系结构范式,导致“新式”Angular 变得与 Angular 向后不兼容。


这就给大部分开发者提出了一个棘手问题: 该使用哪个版本呢?


尽管对于此问题从来没有一个放之四海而皆准的答案,但历史表明,最终选用的还是更高版本(仅有为数不多的例外情况)。


这样一来,就形成了基本的推荐做法: 如果是刚开始处理项目(即所谓的“未开发”项目),且没有要维护或扩展的现有代码,请使用最新最棒的稳定版框架。由于我的应用程序(我一直在开发的扬声器分级门户)绝对属于未开发项目一类,因此在本系列专栏中,我将使用新版 Angular 2(将 Angular 1 视为原始产品)。


当然,很容易就会做出相反的决定。幸运的是,Internet 上有许多不错的 Angular 教程(如果为了让所有 Angular 1 教程编写人员的辛苦工作不白费而选择 Angular 1 的话,那也真够行的)。


不过,我要警告的是,将 Angular 1 应用移植到 Angular 2 更相当于完全重写。所以,请务必在今后规划时将此问题考虑在内。


与此同时,我们将对 Angular 2 进行一些探索。



开始使用

若要使用任何一项新技术,首先需要编写到处可见的“Hello World”。不过,我立即想到在生成 Angular 2“Hello World”应用时有两件有意思的事情,需要在深入探究前讨论。


第一件,使用诸如 Angular 之类的 Web 框架时,安装过程通常非常轻量级,令人难以置信(与安装新的编程语言、IDE 和数据库等相比),因为大多数情况下,实际库本身可以直接从 CDN 或主机服务器中提取。不过,对于大部分开发任务来说,最好是从本地文件系统运行库,因为这是开始使用 Angular 2 时的默认方法,也是我将采用的方法。


第二件,首次运行 Angular 2 时克隆 Git 存储库。也就是说,开始使用时的默认方法是克隆 GitHub 上的现有 Git 存储库,这与 IDE 托管的“项目模板”恰恰相反。 其他语言和框架开始流行采用这种方法。这种方法的优势显而易见,不仅易于理解、无需维护(这一点可能是最重要的),还易于扩展,从而可以添加原始模板没有的其他功能(结构、内容等)。


因此,假定已在计算机上安装 Node.js(关注本系列专栏的读者应已安装),同时通过 Git 请求获取 Angular 2“快速入门”项目:


git clone https://github.com/angular/quickstart.git hello


假定这会连接到 GitHub 并成功克隆项目,现有大量文件驻留在“hello”子目录中。对于简单的“Hello World”应用程序,其实还有很多步骤绝对有必要执行,Angular 团队也承认这一点。在存储库的自述文件中,特别声明了要放置其他许多文件,以从头培养一些好习惯,如对前端代码执行单元测试和端到端 (e2e) 测试。


我们稍后将深入探究这些。现在,扫一眼目录就会发现一些对 MEAN 开发者来说应该比较熟悉的内容:突出显示的 package.json(npm 清单文件)和 tsconfig.json(TypeScript 配置文件)。


回顾一下,从源控件中拉取 Node.js 项目的标准做法是启动依赖项。因此,在执行其他任何操作前,请先拉取依赖项,并通过执行以下命令对项目执行唤醒式调用,然后在浏览器中转到端口 3000(实际上,在该端口运行本地 HTTP 服务器后,脚本通常就会立即为你打开一个端口):


npm installnpm start


然后,就会看到 Web 框架亲切的问候语,如图 1 所示。

图 1:欢迎使用 Angular 2 Web 框架


就其自身而言,知道一切正常运行总是令人高兴,但除此之外程序员还想查看代码。回到运行 HTTP 服务器的命令行管理程序,然后按 Ctrl+C 关闭一切。(或者,打开同一目录的第二个命令行管理程序,哪种方法更容易就选择哪种。)


下面我们来了解一下,好吗?


代码概览


虽然在 Angular 2 应用程序中查找代码的首选位置当然是 index.html 文件,但其实眼下此文件给人带来的更多是困惑(而非帮助);我们暂且不谈这种方法,将在其他地方予以深究。


Angular 团队最先承认“快速入门”的目录结构并不可作为构建代码结构的参考,但通常情况下,所有 Angular 2 应用都包含某种“源”目录(而不是项目的主根),用来驻留应用程序。


(这样一来,可以更轻松地进行捆绑,而无需拉取各种仅供开发者使用的文件,如 package.json。) 在“快速入门”中,此目录被称为“应用”,它包含三个文件:main.ts 以及 app.component.ts 和 app.module.ts(看起来紧密关联的两个文件)。


(请注意,因为 TypeScript 转译器会就地修改这些文件,所以此目录可能不止包含这些文件,但更显而易见的是,所有这些文件都互相关联,例如,main.ts 会生成 main.js 和 main.js.map)。


第一个文件 main.ts 的用途很明确,它是 Angular 2 应用程序的主入口点,而其他两个文件的用途并非那么明确。不过,我们将介绍所有这三个文件。


入口点: Main.ts



main.ts 的内容乍一看有点令人捉摸不透:


import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);



并不完全清晰明了。不过,我们将逐个部分地来了解它。看过我上一期有关 TypeScript 的专栏就会知道,“import”语句会从另一个文件中拉取符号。如你所见,它正在从两个不同的位置导入符号。


第一个语句中的 platformBrowserDynamic 来自 Angular 库的某个位置,因此这可能是启动 Angular 2 环境和库的标准样本。(最后一行代码明确证实了这一点。) 然而,第二个语句从本地文件 app.module 导入,这听上去很像是必须包含你的代码。


大部分情况下,在整个 Angular 2 开发过程中 main.ts 保持不变,与应用程序相关的一切反正都位于模块文件 (app.module.ts) 中,但了解上下文总是非常有用的。


(如果跟踪 index.html 的痕迹,最终会发现通过 System.js 模块加载程序机制加载 main.js 的位置,尽管此时并不推荐这样做。) 也就是说,大部分操作是在 app.module 及其关系中执行。


应用程序模块: App.module.ts



与上一版一样,Angular 2 致力于将应用程序代码模块化为可管理的小块,这样做首先需要将整个应用程序内的元素放到一个位置(Angular 2 将其称为“模块”)。因此,该文件将拉取几个 Angular 2 概念,然后声明应用程序模块,以及反过来使用的内容:


import { NgModule }      from '@angular/core';import { BrowserModule } from '@angular/platform-browser';import { AppComponent }  from './app.component';
@NgModule({imports:      [ BrowserModule ],declarations: [ AppComponent ],bootstrap:    [ AppComponent ]
})export class AppModule { }


再强调一遍,此时全都是 import 语句: 首先,拉取一些与 Angular 2 相关的概念(NgModule 和 BrowserModule),然后导入应用程序组件(我很快就会介绍)。


不过,请注意,NgModule(如我在上一期专栏中所述)本质上是 TypeScript 修饰器,这也是为什么 Angular 2 提供所需的全部功能,同时还允许开发者使用框架专心开发应用程序专有类(本文称为“AppModule”)的应用程序专有功能。


Angular 2 在将代码和功能分入各个模块和组件方面采取强硬立场,了解这一点实际上非常重要。这将是 Angular 2 中不断重复的主题,而在 Angular 1 中,我们可以将代码看作是大致按开发者选择的任意方式排列(但开发者多半是选择根本不进行排列)。


在 Angular 2 中,库强制开发者即时应对组织架构。使用 Angular 2,可以根据需要选择模块和组件的粒度,但毋庸置疑,必须将代码和功能分入各个模块和组件。这就是 Angular 的独到之处,必须予以遵循。


NgModule 修饰器提供此模块的元数据,包括它依赖的其他模块、它导出的声明(我很快就会介绍相应的用法)以及需要执行的启动。NgModule 包含多个选项方便你此时传递,而随着 Angular 2 应用程序越来越复杂,这些选项也会相应增加。为此文件添加书签,因为你将多次回到这里。


Hello World 组件: App.component.ts


最后要介绍的是实际的应用程序组件,它是目前为止唯一一个定义 UI(总之是它的所有代码行)的组件。下面就是 app.component.ts 文件:


import { Component } from '@angular/core';
@Component({selector: 'my-app',template: `<h1>Hello {{name}}</h1>`,
})export class AppComponent  { name = 'Angular'; }


同样,组件依赖 Angular 2 构造(组件修饰器),因此它是从 Angular 库内部的相应位置导入。然后,使用两个参数(选择器和模板)将导出的类 AppComponent 声明为 Angular 组件。


模板的作用很容易理解: 这是应用于声明此组件的 HTML 片段(包括 ECMAScript 字符串内插绑定,在此示例中,为 HTML 中的“name”参数)。


因为此模板有时可能会有点大,或至少比此处指定的一行 HTML 要大,所以除了使用“template”外,还可以使用 templateUrl 来指定用于查找模板的外部文件(将在之后的典型情景中这样做)。


选择器参数更加细微,它声明此组件在 UI 中应用到的位置。实际上,这意味着,只要“my-app”标记在 HTML 中显示,就会应用此组件。到目前为止,还没有看到任何 <my-app> 标记,完全是因为这个特殊的标记是在 index.html 文件内部进行声明(我尚未对此进行介绍):


<!DOCTYPE html>
<html><head><title>Angular QuickStart</title><!-- bunch of other stuff snipped for simplicity --></head><body><my-app>Loading AppComponent content here ...</my-app></body>
</html>


请注意,“my-app”标记括住了一些文本,这主要是占位符文本,可能显示,也可能不显示,具体视浏览器加载和呈现应用程序的速度而定。


总结


生成简单的“Hello World”需要完成大量工作;如果只要直接编写 HTML,省掉剩下的工作,似乎会轻松得多。不过,Angular 的独到之处主要是在组件的基础上生成应用程序(而不光是到处都编写 HTML、CSS 和 JS),此类组织和结构是有开销的。


事实上,到目前为止我所介绍的 90% 基本上都是 Angular 开销。随着应用程序不断变大,开销会按比例缩减,让应用程序开发者可以将全部精力集中在体现应用程序的精髓上。而这恰恰正是应用程序框架应起到的作用。


不过,相关介绍自然尚未完结。Angular 2 还有很多要探索的地方,我们有一个准应用程序有待生成和启动。


在今后的专栏中,我将探索如何创建组件,特别是对扬声器列表执行一些基本的 CRUD(从内存中的“数据库”入手),以及 Angular 2 是如何让一切变得简单易操作的。请耐心等待,未来会有更多精彩内容。在那以前,祝你编码愉快!




Ted Neward 是本部位于西雅图的 Polytechnology 公司的顾问、讲师和导师。他是一位 F #MVP,写过 100 多篇文章,独自撰写并与人合著过十几本书。


如果您有兴趣请他参与您的团队工作,请通过 ted@tedneward.com 与他联系,或通过 blogs.tedneward.com 访问其博客。


衷心感谢以下技术专家对本文的审阅: Ward Bell


原文地址:https://msdn.microsoft.com/zh-cn/magazine/mt793274


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

内容转载自公众号

微软中国MSDN
微软中国MSDN
了解更多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326423.shtml

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

相关文章

php公告滚动源码,10行js代码实现上下滚动公告效果方法

本文主要给大家介绍了关于利用10行js代码实现滚动公告效果的相关资料&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值&#xff0c;需要的朋友们下面随着小编来一起看看吧。希望能帮助到大家。需求在最近的项目中需要实现公…

MySQL left()函数

转载自 MySQL left()函数 MySQL LEFT函数介绍 LEFT()函数是一个字符串函数&#xff0c;它返回具有指定长度的字符串的左边部分。 下面是LEFT()函数的语法 - LEFT(str,length);LEFT()函数接受两个参数&#xff1a; str是要提取子字符串的字符串。length是一个正整数&…

2020蓝桥杯省赛---java---B---10(整数小拼接)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int k sc.nextInt();int[] array new int[n];for (int i 0; i < n; i…

[ASP.NET Core] Middleware

前言 本篇文章介绍ASP.NET Core里&#xff0c;用来处理HTTP封包的Middleware&#xff0c;为自己留个纪录也希望能帮助到有需要的开发人员。 ASP.NET Core官网 结构 在ASP.NET Core里&#xff0c;每个从「浏览器传入」的HTTP Request封包&#xff0c;会被系统封装为「HttpReques…

2015蓝桥杯省赛---java---C---6(奇妙的数字)

题目描述 思路分析 看到这题目想到的就是 for 循环遍历数字&#xff0c;然后计算它的平方和立方再去判断它们刚好使用0-9这10个数各一次。 代码实现 package com.kuang.study.lanqiao;/*** 创建人 wdl* 创建时间 2021/4/8* 描述*/ public class Main {public static void ma…

MySQL substring()函数

转载自 MySQL substring()函数 在本教程中&#xff0c;我们将向您介绍MySQL SUBSTRING函数从字符串中提取子字符串。 SUBSTRING函数从特定位置开始的字符串返回一个给定长度的子字符串。 MySQL提供了各种形式的子串功能。 我们将在以下部分中检查SUBSTRING函数的每种形式。…

跨平台的.NET邮件协议MailKit组件解析

发起的.NET Core开源组织号召&#xff0c;进展的速度是我自己也没有想到的&#xff0c;很多园友都积极参与&#xff08;虽然有些人诚心砸场子&#xff0c;要是以我以前的宝脾气&#xff0c;这会应该被我打住院了吧&#xff0c;不过幸好是少数&#xff0c;做一件事总有人说好&am…

2015蓝桥杯省赛---java---C---9(打印大X)

题目描述 思路分析 找规律 代码实现 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int x sc.nextInt();int y sc.nextInt();char [][] arr new char[y][y…

老司机实战Windows Server Docker:1 初体验之各种填坑

前言 Windows Server 2016正式版发布已经有近半年时间了&#xff0c;除了看到携程的同学分享了一些Windows Server Docker的实践经验&#xff0c;网上比较深入的资料&#xff0c;不管是中文或英文的&#xff0c;都还不太多。工作中对Windows Server 2016下的Docker&#xff0c…

.NET Core项目从xproj+project.json向csproj迁移简介

3月7日&#xff0c;微软发布了Visual Studio 2017 RTM&#xff0c;与之一起发布的还有.NET Core Runtime 1.1.0以及.NET Core SDK 1.0.0&#xff0c;尽管这些并不是最新版&#xff0c;但也已经从preview版本升级到了正式版。所以&#xff0c;在安装Visual Studio 2017时如果启用…

马踏棋盘算法(骑士周游)+贪心优化

思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util.Comparator;public class HorseChessboard {private static int x;//棋盘的列数private static int y;//棋盘的行数//创建一个数组&#xff0c;标记棋盘的各个…

MySQL format()函数

转载自 MySQL format()函数 MySQL FORMAT函数简介 有时&#xff0c;您使用表达式或聚合函数(如AVG)来计算数据库中的值&#xff0c;例如库存周转率&#xff0c;产品的平均价格&#xff0c;平均发票值等。 表达式的结果是十进制数&#xff0c;并带有许多小数位。要格式化这…

马踏棋盘算法(骑士周游)

思路分析 代码实现 package com.atguigu.horse;import java.awt.*; import java.util.ArrayList; import java.util.Comparator;public class HorseChessboard {private static int x;//棋盘的列数private static int y;//棋盘的行数//创建一个数组&#xff0c;标记棋盘的各个…

开源免费的.NET图像即时处理的组件ImageProcessor

承接以前的组件系列&#xff0c;这个组件系列旨在介绍.NET相关的组件&#xff0c;让大家可以在项目中有一个更好的选择&#xff0c;社区对于第三方插件的介绍还是比较少的&#xff0c;很多博文的内容主要还是介绍一些简单的操作&#xff08;很多人都说博客园现在是“hello worl…

人脸识别活体检测测试案例

最近好多人找我要关于人脸识别活体检测的案例&#xff0c;今天正好有空我就更新一下&#xff0c;先解释一下活体&#xff0c;顾名思义就是看看是否是活人在测检&#xff08;大白话解说&#xff09;&#xff0c;用技术上的话也就是看看当前操作者是否是在用照片或者其他方法来操…

2016蓝桥杯省赛---java---B---1(有奖猜谜)

题目描述 思路分析 方案一 直接计算器(有手就行的题) 方案二 package com.kuang.study.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {int x777;String str"vxvxvxvxvxvxvvx";for (int i 0; i < str.length()…

Linux+Nginx+Asp.net Core部署

上篇《Docker基础入门及示例》文章介绍了Docker部署&#xff0c;以及相关.net core 的打包示例。这篇文章我将以oss.offical.site站点为例&#xff0c;主要介绍下在linux机器下完整的部署流程&#xff0c;.net core在docker容器中的运行已经介绍&#xff0c;这里.net core运行环…

com.microsoft.sqlserver.jdbc.SQLServerException: 索引 7 超出范围。

今天在做项目的时候&#xff0c;使用的jdbc底层增加&#xff0c;然后出现了个问题&#xff0c;找了好久没有找出来是什么问题&#xff0c;后来在网上查了下&#xff0c;发现别人都说是&#xff1f;写成了中文的了&#xff0c;于是我就返回来看&#xff0c;没看出来&#xff0c;…

ps中对齐,历史记录,图层

一、对齐&#xff1a; 1.激活对齐&#xff1a;视图–》对齐 2.新建一个文件&#xff0c;然后置入一张图片&#xff0c;设置一个参考线&#xff0c;使用移动工具进行移动&#xff0c;当移动到参考线附近的时候图片会自己吸到参考线上。 3.移动到参考线的时候如需设置空隙&…

Docker基础入门及示例

Docker近几年的发展可谓一日千里&#xff0c;特别从是2013年随着一个基于LXC的高级容器引擎开源&#xff0c;到现在&#xff0c;其在linux和windows上都有了很好的支持&#xff0c;并且已经有很多公司将docker用于实际的生产环境部署当中。这篇文章我将针对以下几个方面简单介绍…