Angular4.0基础知识之组件

Angular4.0基础知识之路由

Angular4.0依赖注入

Angular4.0数据绑定&管道

最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app。

先上个效果图:

环境&版本信息声明

运行ng -v

  1. @angular/cli: 1.2.0
  2. node: 8.1.2
  3. os: win32 x64
  4. @angular/* 4.2.5
  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:

  1. npm install jquery --save
  2. 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

最终拼合结果如下所示,这样,我们的单页面应用的基本骨架就搭建出来啦~

  1. <!--导航条-->
  2. <app-navbar></app-navbar>
  3. <!--/导航条-->
  4. <!--主要内容容器-->
  5. <div class="container">
  6. <div class="row">
  7. <!--左侧-->
  8. <div class="col-md-3">
  9. <!--搜索区域-->
  10. <app-search></app-search>
  11. <!--/搜索区域-->
  12. </div>
  13. <!--/左侧-->
  14. <!--右侧-->
  15. <div class="col-md-9">
  16. <div class="row">
  17. <!--轮播图-->
  18. <app-carousel></app-carousel>
  19. <!--/轮播图-->
  20. </div>
  21. <div class="row">
  22. <!--商品信息-->
  23. <app-product></app-product>
  24. <!--/商品信息-->
  25. </div>
  26. </div>
  27. <!--/右侧-->
  28. </div>
  29. </div>
  30. <!--/主要内容容器-->
  31. <!--底部信息-->
  32. <app-footer></app-footer>
  33. <!--/底部信息-->

组件编写

Angular的组件复用是很重要的一个功能,就比如上面的星级评分组件,不管是商品展示,还是用户评论打分,都会用到,只需要一次知错,就能一直使用

导航条navbar

组件html内容如下

  1. <!--Bootstrap导航条-->
  2. <nav class="navbar navbar-inverse navbar-fixed">
  3. <!--导航条内容容器-->
  4. <div class="container">
  5. <!--导航条头部-->
  6. <div class="navbar-header">
  7. <button class="navbar-toggle btn" data-toggle="collapse" data-target="#navbar-collapse-menu">
  8. <span class="icon-bar"></span>
  9. <span class="icon-bar"></span>
  10. <span class="icon-bar"></span>
  11. </button>
  12. <!--//商标/Logo-->
  13. <a class="navbar-brand" href="javascript:void(0)">在线竞拍</a>
  14. </div>
  15. <!--/导航条头部-->
  16. <!--导航条列表菜单-->
  17. <div class="collapse navbar-collapse" id="navbar-collapse-menu">
  18. <ul class="nav navbar-nav">
  19. <li><a href="javascript:void(0)">关于我们</a></li>
  20. <li><a href="javascript:void(0)">联系我们</a></li>
  21. <li><a href="javascript:void(0)">网站地图</a></li>
  22. </ul>
  23. </div>
  24. <!--/导航条列表菜单-->
  25. </div>
  26. <!--/导航条内容容器-->
  27. </nav>
  28. <!--/Bootstrap导航条-->
  1. .main-wrap{
  2. margin-top: 70px;
  3. }

这时候,我们需要在css文件中添加样式,使中间部分内容乡下偏移约70px,因为fix格式的导航条会盖住内容。

默认的全局css文件是/src/style.css当然也可以在配置文件中更改或者添加新的css文件

当然,每一个组件对应的css样式我们应该分开写,比如navbar的css写在navbar.component.css文件中

底部信息footer

由于尚未编写业务逻辑,简单地先做一下占位即可

  1. <div class="container">
  2. <hr>
  3. <footer>
  4. <div class="row">
  5. <div class="col-md-12">
  6. <p>Angular打造竞拍网站</p>
  7. </div>
  8. </div>
  9. </footer>
  10. </div>
  1. footer{
  2. text-align: center;
  3. }

商品搜索组件

就是上面那个套路,都是使用Bootstrap框架所带的那些css样式,直接贴代码,学过的应该都能看懂。

  1. <form role="form" name="searchForm">
  2. <div class="form-group">
  3. <label for="productTitle" class="control-label">商品名称 : </label>
  4. <input id="productTitle" type="text" class="form-control" placeholder="商品名称">
  5. </div>
  6. <div class="form-group">
  7. <label for="productPrice" class="control-label">商品价格 : </label>
  8. <input id="productPrice" type="number" class="form-control" placeholder="商品价格">
  9. </div>
  10. <div class="form-group">
  11. <label for="productCategory" class="control-label">商品类别 : </label>
  12. <select id="productCategory" class="form-control"></select>
  13. </div>
  14. <div class="form-group">
  15. <label for="productTitle" class="control-label">商品名称 : </label>
  16. <input type="submit" class="btn btn-primary btn-block" value="搜索">
  17. </div>
  18. </form>

轮播图组件

轮播图稍微有些复杂,因为不仅仅使用了HTML,同时也使用了少量的JavaScript和jQuery。当然我相信,来学Angular的肯定不是小白咯。

当然,这一部分主要就是实现一个简单的轮播图,也没有用到什么Angular代码

  1. <div class="carousel slide" data-ride="carousel">
  2. <!--轮播图导航区域-->
  3. <ol class="carousel-indicators">
  4. <li class="active"></li>
  5. <li></li>
  6. <li></li>
  7. </ol>
  8. <!--/轮播图导航区域-->
  9. <!--轮播图片区域-->
  10. <div class="carousel-inner">
  11. <div class="item active">
  12. <img src="http://placehold.it/800x300" alt="carousel" class="slide-image">
  13. </div>
  14. <div class="item">
  15. <img src="http://placehold.it/800x300" alt="carousel" class="slide-image">
  16. </div>
  17. <div class="item">
  18. <img src="http://placehold.it/800x300" alt="carousel" class="slide-image">
  19. </div>
  20. </div>
  21. <!--/轮播图片区域-->
  22. <!--轮播图控制按钮-->
  23. <a href="javascript:$('.carousel').carousel('prev')" class="left carousel-control">
  24. <i class="glyphicon glyphicon-chevron-left"></i>
  25. </a>
  26. <a href="javascript:$('.carousel').carousel('next')" class="right carousel-control">
  27. <i class="glyphicon glyphicon-chevron-right"></i>
  28. </a>
  29. <!--/轮播图控制按钮-->
  30. </div>
  1. .slide-image{
  2. width:100%;
  3. }

从下一部分开始我们就需要接触到更多Angular的知识了

商品详情组件

首先,每一件商品都是一个对象,那么我门可以建立如下的模型:

product.component.ts

  1. export class Product {
  2. constructor(
  3. public id: number,
  4. public title: string,
  5. public price: number,
  6. public rating: number,
  7. public desc: string,
  8. public categories: Array<string>
  9. ) {
  10. }
  11. }

然后,在这个ts文件中进行商品(对象)的实例化(因为现在还没有学到http)

  1. export class ProductComponent implements OnInit {
  2. public products: Array<Product>;
  3. constructor() {
  4. }
  5. ngOnInit() {
  6. this.products = [
  7. new Product(1, '第一个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
  8. new Product(2, '第二个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
  9. new Product(3, '第三个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
  10. new Product(4, '第四个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
  11. new Product(5, '第五个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电']),
  12. new Product(6, '第六个商品', 899, 3.5, '这是一个垃圾电脑', ['电子产品', '家电'])
  13. ]
  14. }
  15. }

这样,即可在模块实例化的时候获取到商品对象列表,并传递到component模板中

ngOnInit()方法会在component实例化的时候自动调用一次,这个知识点稍后会更详细讲到

有了数据之后,下一步当然是制作component模板咯,顺便吧数据也显示出来呗(满满的都是套路额)

  1. <div class="col-sm-4 col-md-4 col-lg-4" *ngFor="let product of products">
  2. <div class="thumbnail">
  3. <img src="http://placehold.it/320x150" alt="商品图片">
  4. <div class="caption">
  5. <h4 class="pull-right">¥{{product.price}}</h4>
  6. <h4><a>{{product.title}}</a></h4>
  7. <p>{{product.desc}}</p>
  8. </div>
  9. <div>
  10. <app-stars></app-stars>
  11. </div>
  12. </div>
  13. </div>

ngFor可以理解为在html中对一个数组进行循环遍历,同时循环这个html标签......就类似PHP那样,慢慢理解吧,挺简单的额,稍后也会讲到

但是这个指令反映出来的思想很重要,Angular的数据绑定,也叫作数据驱动

然后,从开始搞事情以来第一个比较难的地方已经过去了(以后你回头看的时候还会发现...其实好简单的哦)

星级评分组件

别看这个组件很小不起眼,但是星际评分组件是当前所有组件里最复杂的一个(相对复杂...)

主要使用了 :

*ngFor指令

class绑定

组件属性值输入@Input()

直接上代码呗

控制器代码如下,这部分代码的关键点在于把Production componentproduct.rating注入到Star Component

  1. export class StarsComponent implements OnInit {
  2. @Input()
  3. public rating: number;
  4. public stars = [];
  5. constructor() {
  6. }
  7. ngOnInit() {
  8. const full: number = Math.floor(this.rating);
  9. const half: number = Math.ceil(this.rating - full);
  10. const empty: number = 5 - full - half;
  11. for (let i = 0; i < 5; i++) {
  12. if (i < full) {
  13. this.stars.push('full');
  14. } else if (i === full && half !== 0) {
  15. this.stars.push('half')
  16. } else {
  17. this.stars.push('empty')
  18. }
  19. }
  20. }
  21. }

如何注入呢?上面有一个装饰器@Input()标识着rating变量是外部注入的

那么,在实例化star component的位置......

就是这里!!!

  1. <app-stars [rating]="product.rating"></app-stars>

就是这么简单

接下来当然是模板代码咯,关键点都在这里

  1. <p>
  2. <i *ngFor="let star of stars" class="fa"
  3. [class.fa-star]="star==='full'"
  4. [class.fa-star-half-o]="star==='half'"
  5. [class.fa-star-o]="star==='empty'"
  6. ></i>
  7. <span>{{rating}}星</span>
  8. </p>

这里首先使用ngFor指令对i标签(星星)进行遍历

接下来使用[class.xxx]进行样式绑定,根据控制器里组合成的数组进行星星标签的生成

这里使用了Font-Awesome图标

代码只要稍微细心看就能看懂,主要就在于样式绑定,根据数组中不同的字符串绑定不同的星星样式

就这样,我们的基本组件已经实现了大部分了,等有空了进行下一章的学习......

Angular4.0从入门到实战打造在线竞拍网站学习笔记之一--组件的更多相关文章

  1. Angular4.0从入门到实战打造在线竞拍网站学习笔记之四--数据绑定&管道

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 数据绑定 数据绑定允许你将组件控制器的属性和方法与组件的模板连接起来,大大降低了开发时的编码量. ...

  2. Angular4.0从入门到实战打造在线竞拍网站学习笔记之三--依赖注入

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 依赖注入(Dependency Injection) 正常情况下,我们写的代码应该是这样子的: let product = ne ...

  3. Angular4.0从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识之组件 Angular4.0基础知识之路由 Angular4.0依赖注入 Angular4.0数据绑定&管道 路由 简介 接下来学习路由的相关知识 本来是不准备写下 ...

  4. Angular4.0学习笔记 从入门到实战打造在线竞拍网站学习笔记之二--路由

    Angular4.0基础知识见上一篇博客 路由 简介 接下来学习路由的相关知识 本来是不准备写下去的,因为当时看视频学的时候感觉自己掌握的不错 ( 这是一个灰常不好的想法 ) ,过了一段时间才发现An ...

  5. Angular 4 学习笔记 从入门到实战 打造在线竞拍网站 基础知识 快速入门 个人感悟

    最近搞到手了一部Angular4的视频教程,这几天正好有时间变学了一下,可以用来做一些前后端分离的网站,也可以直接去打包web app. 环境&版本信息声明 运行ng -v @angular/ ...

  6. Swoole入门到实战 打造高性能 赛事直播平台(完整版)

    Thinkphp+Swoole入门到实战打造高性能赛事直播平台 第1章 课程介绍 欢迎大家来到swoole的课程!本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司 ...

  7. swoole入门到实战打造高性能赛事直播平台☆

    ​ 第1章 课程介绍 本章主要是介绍了swoole的一些特性,以及使用场景,并且分享了swoole在其他公司的一些案例,最后重点讲解了swoole学习的一些准备工作. 第2章 PHP 7 源码安装 本 ...

  8. 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程

    点击了解更多Python课程>>> 零基础入门Python实战:四周实现爬虫网站 Django项目视频教程 适用人群: 即将毕业的大学生,工资低工作重的白领,渴望崭露头角的职场新人, ...

  9. Angular 4.0从入门到实战

    AngularJS 优点 模板功能强大丰富,并且是声明式的,自带了丰富的Angular指令: 是一个比较完善的前端MVC框架,包含模板,数据双向绑定,路由,模块化,服务,过滤器,依赖注入等所有功能: ...

随机推荐

  1. QT环境安装VS2013(系统环境里设置QTDIR,并添加VS2013的BIN目录)

    QT环境安装VS2013 文件名 1.qt5.5.1 qt-opensource-windows-x86-msvc2013-5.5.1.exe 2.qt vs插件 3.qt-vs-addin-1.2. ...

  2. 简明Python3教程 12.问题解决

    我们已经探究了python语言的方方面面,现在我们将通过设计编写一个有用的程序将这些内容有机的结合起来. 主要目标是让大家有能力独自编写程序. 问题 我们要解决的问题是”希望编写一个程序,用于创建所有 ...

  3. Windows7配置QT-Android开发环境!

    配置QT5.2.0-Android版本: 进行windows7下的软件开发~不用使用eclipse开发android软件,配置之后就可以向写C++代码一样,去写APP在Android手机上去运行了! ...

  4. python之强大的日志模块

    1.简单的将日志打印到屏幕   import logging logging.debug('This is debug message')logging.info('This is info mess ...

  5. Select2使用方法汇总

    引用: <script src="~/Content/plugins/select2/select2.min.js"></script> 1.简单使用 $. ...

  6. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(二)-创建项目 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  7. VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#)

    原文:VS中实时获取SVN的版本号并写入到AssemblyInfo.cs中(C#) 在开发项目时,需要知道当前发布的到底是哪个版本,比较好的方式就是获取SVN的版本来作为项目的版本.项目版本一般由主版 ...

  8. Emgu-WPF 激光雷达研究-移动物体跟踪2

    原文:Emgu-WPF 激光雷达研究-移动物体跟踪2 初步实现了去燥跟踪,并用圆点标注障碍物 https://blog.csdn.net/u013224722/article/details/8078 ...

  9. WPF DatePicker默认显示当前日期,格式化为年月日

    原文:WPF DatePicker默认显示当前日期 WPF的日历选择控件默认为当前日期,共有两种方法,一种静态,一种动态. 静态的当然写在DatePicker控件的属性里了,动态的写在对应的cs文件里 ...

  10. 检查Android是否支持指纹识别以及是否已经录入指纹

    原文:检查Android是否支持指纹识别以及是否已经录入指纹 Android M 开始,系统中加入了指纹相关功能. 主要用到的类为:FingerprintManager 只提供三个方法: 返回值 方法 ...