Angular 权威教程 | 第3章 Angular 工作原理

第一个重要概念:Angular应用是由组件构成的。 可以将组件理解为一种教浏览器认识新HTML标签的方式。

应用

一个Angular应用其实就是一棵由组件构成的树。
在这棵树的根结点,最顶层的组件就是应用本身。 它会在浏览器启动(也叫引导)应用的时候被渲染

  • 树型结构,被渲染时,递归渲染下级组件
  • 可组合的。于小组件构建大组件
库存管理系统

分解成三个高层级组件

  1. 主导航组件
  2. 面包屑导航组件
  3. 产品列表组件
    1. 产品图片
    2. 产品分类
    3. 价格显示
应用树状图

产品数据模型

Angular不要求使用指定的数据模型库,支持多种不同的数据模型(和数据架构)

/**
Provides a `Product` object
Product类不依赖Angular中的任何东西,它只是一个我们会在应用中用到的数据模型
/
class Product {
constructor(
public sku: string,
public name: string,
public imageUrl: string,
public department: string[],
public price: number) {
}
}

组件

“应用”本身就是一个顶层组件,并且我们把应用划分成了细粒度的组件。

组成

  • 组件注解
  • 视图
  • 控制器
// 一个基本的顶层应用InventoryApp(库存管理系统) 
// @Component被称作注解。 它给紧随其后的类(InventoryApp) 添加了一些元数据
@Component({
selector: 'inventory-app',
template: `
<div class="inventory-app">
(Products will go here soon)
</div>
`
})
class InventoryApp {
// Inventory logic here}

组件注解

@Component 注解是对组件进行配置的地方。 一般来说,@Component 会配置你的组件如何与外界交互

组件selector

// Angular会使用我们定义的InventoryApp组件来实现这个标签的功能
<inventory-app></inventory-app>
// 匹配一个以组件名为属性的普
通div元素
<div inventory-app></div>

组件template

@Component({selector: 'inventory-app',
//定义组件所用的HTML模板
template: `
<div class="inventory-app">
(Products will go here soon)
</div>
`
})

添加产品

// 创建一个Product
let newProduct = new Product(
'NICEHAT', // sku
'A Nice Black Hat', // name
'resourcesimages/products/black-hat.jpg', // imageUrl
['Men', 'Accessories', 'Hats'], // department
29.99); // pric

一般情况下, 函数传递不超过5个参数。 另一种做法是将Product类的构造函数修改为接收一个配置对象, 这样就不必记住参数的顺序。

new Product({sku: "MYHAT", name: "A green hat"})
class InventoryApp {
product: Product;
constructor() {
let newProduct = new Product(
'NICEHAT',
'A Nice Black Hat',
'resourcesimages/products/black-hat.jpg',
['Men', 'Accessories', 'Hats'],
29.99);
this.product = newProduct;
}
} 
// 简洁版
// 1. 添加了一个 constructor。 当 Angular 创建这个组件的实例时, 
//    会调用这个 constructor。 组件进行初始化
// 2. 声明了一个实例变量。在 InventoryApp 的实例中定义了一个名叫 product 的属性,
//    用于保存 Product 对象。
// 3. 给 product 属性赋值了一个 Product 实例。 在 constructor 中, 
//    我们创建了一个 Product 的实例, 并把它赋值给 product 实例变量
class InventoryApp {
    product: Product;
    constructor() {
    this.product = new Product(
        'NICEHAT',
        'A Nice Black Hat',
        'resourcesimages/products/black-hat.jpg',
        ['Men', 'Accessories', 'Hats'],
        29.99);
    }
}

用模板绑定来查看产品

@Component({
selector: 'inventory-app',
template: `
<div class="inventory-app">
// 花括号中的内容是一个表达式 可以这样{{ count + 1 }}
<h1>{{ product.name }}</h1>
<span>{{ product.sku }}</span>
</div>
`
})

添加更多产品

// 把 InventoryApp 中的一个 Product 属性修改
为 Product 数组
class InventoryApp {
    // Array<Product>
    products: Product[];
    constructor() {
    this.products = [];
    }
}
// 创建一些 Product
class InventoryApp {
products: Product[];
constructor() {
this.products = [new Product(
'MYSHOES',
'Black Running Shoes',
'resourcesimages/products/black-shoes.jpg',
['Men', 'Shoes', 'Running Shoes'],
109.99),
new Product(
'NEATOJACKET',
'Blue Jacket',
'resourcesimages/products/blue-jacket.jpg',
['Women', 'Apparel', 'Jackets & Vests'],
238.99),
new Product(
'NICEHAT',
'A Nice Black Hat',
'resourcesimages/products/black-hat.jpg',
['Men', 'Accessories', 'Hats'],
29.99)
];
}

选择一个产品

// 给InventoryApp定义一个新方法productWasSelected, 用来响应用户对产品的选择

(待续……)

用<products-list>列出产品

产品列表组件

设置ProductsList的@Component配置项

组件的输入

组件的输出

触发自定义事件

编写ProductsList的控制器类

编写ProdctsList的视图模板

完整的ProductsList组件

产品条目组件

产品条目的组件配置

产品条目组件的定义类

产品条目组件的template

完整的ProductRow代码清单

产品图片组件

价格展示组件

产品分类组件

创建NgModule并启动应用

启动应用

完整的项目

关于数据架构的一点说明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容

  • 仿制Reddit网站 读完本章之后, 你将掌握如何构建基本的Angular应用。 简单的应用将涵盖Angular中...
    东东少将阅读 3,174评论 1 28
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,358评论 6 343
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,568评论 25 707
  • 如果我能躺在被窝, 如果我能被主人抱。 如果我能喝牛奶, 如果我能飞在天空。 如果我能吃饭…… 可惜我不能, 因为...
    桑涛v阅读 113评论 0 0