Angular4.0从入门到实战打造在线竞拍网站学习笔记之一--组件
Angular4.0基础知识之组件
Angular4.0基础知识之路由
Angular4.0依赖注入
Angular4.0数据绑定&管道
最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app。
先上个效果图:

环境&版本信息声明
运行ng -v
@angular/cli: 1.2.0
node: 8.1.2
os: win32 x64
@angular/* 4.2.5
...
好吧,那就顺便写个笔记/教程/备忘/博客咯
安装Angular脚手架
安装的时候选择全局安装
npm install @angular/cli -g
创建Angular项目
运行命令
ng new AngularStudy
其中AngularStudy是项目文件夹名称
启动项目开发环境
在当前创建的项目目录下运行 如下命令
ng serve或者npm run start,然后在浏览器中进入所提示的地址,默认是http://127.0.0.1:4200/
当你访问页面的时候出现AngularLogo的时候,说明你的项目已经创建成功了,反之,请检查错误信息或日志
提示:在我学习的过程中遇到了一个问题,就是在Windows10系统中,当你的用户文件夹是中文名称的时候,你就要小心了,你很有可能会在创建过程中遇到错误,具体是什么错误...额我忘了,那个错误百度谷歌都找不到答案,如果你解决不了,检查一下是不是这个问题,百度有修改用户文件夹名称的教程(需要修改注册表,小白慎入)
安装jQuery和Bootstrap
在我们的开发流程中,jQuery和Bootstrap这两个框架已经是不可或缺的一部分了,那么,如何在Angular中优雅地安装并使用呢?
其实这很简单,首先运行以下两条命令安装jQuery和Bootstrap:
npm install jquery --save
npm install bootstrap --save
这时候,两个框架就已经安装到了我们的node_modules模块目录下了
但是你会发现,在TypeScript中尝试使用$符号的时候,编辑器仍然不能识别,这是为什么呢?
经过Google的提示,终于解决了这个问题
安装JQuery的类型描述文件,运行如下命令
npm install @types/jquery --save-dev
同理安装Bootstrap的TypeScript类型描述文件
npm install @types/bootstrap --save-dev
安装这两个类型描述模块的目的是让TypeScript认识jQuery和Bootstrap的语法,进而能在ts文件中使用它们
OK,是不是很简单呢?
生成组件
Angular毕竟是有Google做后台的,功能方面也相当齐全,component不需要我们手动地去创建,只需要一条命令即可生成
在项目根目录运行ng g component navbar 生成导航条组件
这条命了的意思就是angular generate component navbar,简单明了
有了这条命令,我们就能很轻易地生成项目中的组件
| 组件名 | 用途 |
|---|---|
| app | 项目自带的默认component |
| navbar | 网页/APP导航条 |
| search | 搜索区域 |
| product | 商品详情 |
| stars | 星级评分 |
| foot | 底部信息 |
就这样,我们的项目骨架就搭建完成了
对模块进行布局
模块创建完成了,那么,我们下一步需要做什么?当然是就像拼图一样,使用创建好的模块,拼接起来,成为一个简单的单页面应用咯!
至于我们的拼图底板是什么,分析Angular的启动,app作为默认显示出来的component,肯定是在app.component.html中进行拼接了。
打开我们的app.component.html,删除里面无用的内容,使用我们刚刚创建的component在里面拼图吧
一般情况下,我们创建的组件所对应的css元素选择器(也就是标签),名字是app-componentName
最终拼合结果如下所示,这样,我们的单页面应用的基本骨架就搭建出来啦~
<!--导航条-->
<app-navbar></app-navbar>
<!--/导航条-->
<!--主要内容容器-->
<div class="container">
<div class="row">
<!--左侧-->
<div class="col-md-3">
<!--搜索区域-->
<app-search></app-search>
<!--/搜索区域-->
</div>
<!--/左侧-->
<!--右侧-->
<div class="col-md-9">
<div class="row">
<!--轮播图-->
<app-carousel></app-carousel>
<!--/轮播图-->
</div>
<div class="row">
<!--商品信息-->
<app-product></app-product>
<!--/商品信息-->
</div>
</div>
<!--/右侧-->
</div>
</div>
<!--/主要内容容器-->
<!--底部信息-->
<app-footer></app-footer>
<!--/底部信息-->
组件编写
Angular的组件复用是很重要的一个功能,就比如上面的星级评分组件,不管是商品展示,还是用户评论打分,都会用到,只需要一次知错,就能一直使用
导航条navbar
组件html内容如下
<!--Bootstrap导航条-->
<nav class="navbar navbar-inverse navbar-fixed">
<!--导航条内容容器-->
<div class="container">
<!--导航条头部-->
<div class="navbar-header">
<button class="navbar-toggle btn" data-toggle="collapse" data-target="#navbar-collapse-menu">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!--//商标/Logo-->
<a class="navbar-brand" href="javascript:void(0)">在线竞拍</a>
</div>
<!--/导航条头部-->
<!--导航条列表菜单-->
<div class="collapse navbar-collapse" id="navbar-collapse-menu">
<ul class="nav navbar-nav">
<li><a href="javascript:void(0)">关于我们</a></li>
<li><a href="javascript:void(0)">联系我们</a></li>
<li><a href="javascript:void(0)">网站地图</a></li>
</ul>
</div>
<!--/导航条列表菜单-->
</div>
<!--/导航条内容容器-->
</nav>
<!--/Bootstrap导航条-->
.main-wrap{
margin-top: 70px;
}
这时候,我们需要在css文件中添加样式,使中间部分内容乡下偏移约70px,因为fix格式的导航条会盖住内容。
默认的全局css文件是
/src/style.css当然也可以在配置文件中更改或者添加新的css文件
当然,每一个组件对应的css样式我们应该分开写,比如navbar的css写在navbar.component.css文件中
底部信息footer
由于尚未编写业务逻辑,简单地先做一下占位即可
<div class="container">
<hr>
<footer>
<div class="row">
<div class="col-md-12">
<p>Angular打造竞拍网站</p>
</div>
</div>
</footer>
</div>
footer{
text-align: center;
}
商品搜索组件
就是上面那个套路,都是使用Bootstrap框架所带的那些css样式,直接贴代码,学过的应该都能看懂。
<form role="form" name="searchForm">
<div class="form-group">
<label for="productTitle" class="control-label">商品名称 : </label>
<input id="productTitle" type="text" class="form-control" placeholder="商品名称">
</div>
<div class="form-group">
<label for="productPrice" class="control-label">商品价格 : </label>
<input id="productPrice" type="number" class="form-control" placeholder="商品价格">
</div>
<div class="form-group">
<label for="productCategory" class="control-label">商品类别 : </label>
<select id="productCategory" class="form-control"></select>
</div>
<div class="form-group">
<label for="productTitle" class="control-label">商品名称 : </label>
<input type="submit" class="btn btn-primary btn-block" value="搜索">
</div>
</form>
轮播图组件
轮播图稍微有些复杂,因为不仅仅使用了HTML,同时也使用了少量的JavaScript和jQuery。当然我相信,来学Angular的肯定不是小白咯。
当然,这一部分主要就是实现一个简单的轮播图,也没有用到什么Angular代码
<div class="carousel slide" data-ride="carousel">
<!--轮播图导航区域-->
<ol class="carousel-indicators">
<li class="active"></li>
<li></li>
<li></li>
</ol>
<!--/轮播图导航区域-->
<!--轮播图片区域-->
<div class="carousel-inner">
<div class="item active">
<img src="http://placehold.it/800x300" alt="carousel" class="slide-image">
</div>
<div class="item">
<img src="http://placehold.it/800x300" alt="carousel" class="slide-image">
</div>
<div class="item">
<img src="http://placehold.it/800x300" alt="carousel" class="slide-image">
</div>
</div>
<!--/轮播图片区域-->
<!--轮播图控制按钮-->
<a href="javascript:$('.carousel').carousel('prev')" class="left carousel-control">
<i class="glyphicon glyphicon-chevron-left"></i>
</a>
<a href="javascript:$('.carousel').carousel('next')" class="right carousel-control">
<i class="glyphicon glyphicon-chevron-right"></i>
</a>
<!--/轮播图控制按钮-->
</div>
.slide-image{
width:100%;
}
从下一部分开始我们就需要接触到更多Angular的知识了
商品详情组件
首先,每一件商品都是一个对象,那么我门可以建立如下的模型:
product.component.ts
export class Product {
constructor(
public id: number,
public title: string,
public price: number,
public rating: number,
public desc: string,
public categories: Array<string>
) {
}
}
然后,在这个ts文件中进行商品(对象)的实例化(因为现在还没有学到http)
export class ProductComponent implements OnInit {
public products: Array<Product>;
constructor() {
}
ngOnInit() {
this.products = [
new Product(1, '第一个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
new Product(2, '第二个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
new Product(3, '第三个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
new Product(4, '第四个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
new Product(5, '第五个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
new Product(6, '第六个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电'])
]
}
}
这样,即可在模块实例化的时候获取到商品对象列表,并传递到component模板中
ngOnInit()方法会在component实例化的时候自动调用一次,这个知识点稍后会更详细讲到
有了数据之后,下一步当然是制作component模板咯,顺便吧数据也显示出来呗(满满的都是套路额)
<div class="col-sm-4 col-md-4 col-lg-4" *ngFor="let product of products">
<div class="thumbnail">
<img src="http://placehold.it/320x150" alt="商品图片">
<div class="caption">
<h4 class="pull-right">¥{{product.price}}</h4>
<h4><a>{{product.title}}</a></h4>
<p>{{product.desc}}</p>
</div>
<div>
<app-stars></app-stars>
</div>
</div>
</div>
ngFor可以理解为在html中对一个数组进行循环遍历,同时循环这个html标签......就类似PHP那样,慢慢理解吧,挺简单的额,稍后也会讲到
但是这个指令反映出来的思想很重要,Angular的数据绑定,也叫作数据驱动
然后,从开始搞事情以来第一个比较难的地方已经过去了(以后你回头看的时候还会发现...其实好简单的哦)
星级评分组件
别看这个组件很小不起眼,但是星际评分组件是当前所有组件里最复杂的一个(相对复杂...)
主要使用了 :
*ngFor指令
class绑定
组件属性值输入@Input()
直接上代码呗
控制器代码如下,这部分代码的关键点在于把Production component的product.rating注入到Star Component中
export class StarsComponent implements OnInit {
@Input()
public rating: number;
public stars = [];
constructor() {
}
ngOnInit() {
const full: number = Math.floor(this.rating);
const half: number = Math.ceil(this.rating - full);
const empty: number = 5 - full - half;
for (let i = 0; i < 5; i++) {
if (i < full) {
this.stars.push('full');
} else if (i === full && half !== 0) {
this.stars.push('half')
} else {
this.stars.push('empty')
}
}
}
}
如何注入呢?上面有一个装饰器@Input()标识着rating变量是外部注入的
那么,在实例化star component的位置......
就是这里!!!
<app-stars [rating]="product.rating"></app-stars>
就是这么简单
接下来当然是模板代码咯,关键点都在这里
<p>
<i *ngFor="let star of stars" class="fa"
[class.fa-star]="star==='full'"
[class.fa-star-half-o]="star==='half'"
[class.fa-star-o]="star==='empty'"
></i>
<span>{{rating}}星</span>
</p>
这里首先使用
ngFor指令对i标签(星星)进行遍历
接下来使用[class.xxx]进行样式绑定,根据控制器里组合成的数组进行星星标签的生成
这里使用了Font-Awesome图标
代码只要稍微细心看就能看懂,主要就在于样式绑定,根据数组中不同的字符串绑定不同的星星样式
就这样,我们的基本组件已经实现了大部分了,等有空了进行下一章的学习......
Angular4.0从入门到实战打造在线竞拍网站学习笔记之一--组件的更多相关文章
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定&管道
Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 数据绑定 数据绑定允许你将组件控制器的属性和方法与组件的模板连接起来,大大降低了开发时的编码量. ...
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入
Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...
- Angular4.0从入门到实战打造在线竞拍网站学习笔记之二--路由
Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 路由 简介 接下来学习路由的相关知识 本来是不准备写下 ...
- Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由
Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...
- Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟
最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...
- Swoole入门到实战 打造高性能 赛事直播平台(完整版)
Thinkphp+Swoole入门到实战打造高性能赛事直播平台 第1章 课程介绍 欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司 ...
- swoole入门到实战打造高性能赛事直播平台☆
第1章 课程介绍 本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作. 第2章 PHP 7 源码安装 本 ...
- 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程
点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...
- Angular 4.0从入门到实战
AngularJS 优点 模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令: 是一个比较完善的前端MVC框架,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能: ...
随机推荐
- 写在使用 Linux 工作一年后
start 去年公司空了几台台式机,当时看了下似乎配置比我用的乞丐版 air 略高一些,而且除了 ssd 以外还有一个 1T 的大硬盘,加上后面可能会有一段时间不做 iOS 了,那就不需要 macOS ...
- Android显示gif格式图片
大家知道,在Android中使用ImageView来显示gif格式的图片,我们无法得到gif格式图片该有的效果,它只会停在第一帧上,而不会继续.这时只能看到一张静态的图片,这里我们可以使用个简单的方法 ...
- OpenGL中GLSL渲染茶壶光照完整程序
顶点着色器VertexShader.txt: uniform vec3 lightposition;//光源位置 uniform vec3 eyeposition;//相机位置 uniform vec ...
- 关于提高UDP发送效率的方法
UDP的发送效率和什么因素有关呢? 直观觉得,UDP的切包长越大,应该发送效率越高(最长为65536).可是依据实际測试和在网上查到的资料的结果,包长度为1024为发送效率最高. 这样的结果让人感到疑 ...
- Qt控件焦点切换
们日常切换控件,例如QQ登陆的账号和密码输入框就可以通过Tab键切换焦点. 图1 qq切换焦点 Qt中QWidget提供了一个静态方式实现该效果 其中也包含介绍使用 [static] void QW ...
- 监听WPF依赖属性
原文:监听WPF依赖属性 当我们使用依赖属性的时候,有时需要监听它的变化,这在写自定义控件的时候十分有用, 下面介绍一种简单的方法. 如下使用DependencyPropertyDescripto ...
- TL9000 电信业质量体系管理标准
1.背景介绍:1987年国际标准化组织创立了ISO9000标准.标准发布后,在世界范围内得到了迅速的推广和广泛的认可,成为全世界衡量质量管理水平与质量保证能力的公共标准.九十年代,美国三大汽车公司和航 ...
- golang中jwt使用
golang 中jwt使用方式总结. 1. golang示例代码 import ( "fmt" "time" "github.com/dgrijalv ...
- python之强大的日志模块
1.简单的将日志打印到屏幕 import logging logging.debug('This is debug message')logging.info('This is info mess ...
- Nginx支持LInux的软链接或硬链接
在我们配置nginx的时候,有些时候,大部分都是讲root指向真实的目录.但是有些时候,我们需要指向一个软链接.但是配置的时候,发现会有问题. 我们可以通过以下的方法,来解决,让nginx支持软链接/ ...