Angular4.x学习日志
码云链接:https://gitee.com/ccsoftlucifer/Angular4Study
1.部署环境
安装nodejs
安装angular脚手架程序
2.创建工程
ng new 项目名称 // 创建一个项目
add routing
yes
css
yes
npm install //安装依赖
ng serve --open //启动
注意:
如果ng serve --open启动失败,删除model文件夹,然后重新install.
如果没有在项目根目录运行 会出错。

3.目录分析
工程的目录那么多,重要的其实也就几个。
node_modules //安装的第三方模块
src //项目所有文件放在src里面
src/app //组件 以及 app.mdule.ts 定义根模块
src/index.html //首页
src/style.css //全局css样式文件
package.json //npm配置文件

这三个文件就组成了一个组件。
4.组件是什么东西呢?
写angular项目其实就是组件,以组件的形式方便引入.
创建一个组件:
比如我要在app/components文件夹下创建一个header的组件.
先在vscode中右键app目录,创建components文件夹.
然后到工程的根目录,使用命令
ng g component components/header


注意:所有以spec.ts结尾的文件都可以删除.
这个文件是多余的,删除掉.创建完毕之后的目录结构如下:

这个时候可以直接在首页app.components.html中引入这个组件了.

这个时候项目会去找路由,路由中添加了新建的组件的路径,他就会自动找到.
而为什么是app-XXXX这个名字呢?
是因为在header.components.ts中,定义好了:

看吧是 'app-header'
5.在自定义的组件中编写代码
news.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-news',
templateUrl: './news.component.html',
styleUrls: ['./news.component.css']
})
export class NewsComponent implements OnInit {
// 定义数据 -- 属性
title = 'title变量的值';
// 定义属性的方法2
msg: any;
// 当然可以直接写类型
msgStr: string = '这是string类型的msg';
// 其实变量前面有访问修饰符,默认不写为public
/*
public 共有 可以在类的里外使用
protected 保护类型 只能在当前类和他的子类访问
private 私有只有当前类可以访问这个属性
*/
public id = '=123';
public h = '';
public obj={
name : '张三'
}
// 数据循环方式1
public list=[];
// 数据循环方式2
public list2:any[];
// 定义一个稍微复杂点的数组
public list3:any[];
//<!-- 对象循环 -->
public list4=[];
constructor() {
this.msg='这是msg,通过constructor赋值';
// 去服务器拉取数据
this.h = '<h2>这个是新闻数据</h2>';
this.list=['1','2','3'];
this.list2=['java','php','dotnet'];
this.list3=[
{'title':'XXX和39位外方领导人围桌共绘"工笔画"'},
{'title':'“一带一路”:如何绘制精谨细腻的“工笔画”'},
{'title':'高峰论坛:刷新中国经济“信心指数” 理上网来'}
];
this.list4=[
{
'username':'小a',
"list":[
{'course':'数学','source':100},
{'course':'语文','source':99},
{'course':'英语','source':80},
]
},{
'username':'小b',
"list":[
{'course':'数学','source':80},
{'course':'语文','source':90},
{'course':'英语','source':100},
]
}
];
}
ngOnInit() {
}
}
news.component.html
<app-header></app-header>
<br>
<h2>这是一个新闻组件</h2> <p>
news works!
</p>
title = {{title}}
<br>
msg= {{msg}}
<br>
msgStr = {{msgStr}}
<br>
<!-- 绑定属性方法1 -->
<div id="{{id}}">这是一个div 调试工具查看属性</div>
<br>
<!-- 绑定属性方法2 -->
<div [title]="msg">使用方括号添加属性 调试工具查看属性</div>
<br>
<!-- 绑定后台HTML数据 -->
<span [innerHTML]="h"></span>
<br>
<!-- 拿到对象数据 -->
{{obj.name}}
<br>
<!-- 循环数据 -->
<ul>
<li *ngFor = "let item of list"> {{item}} </li> </ul>
<!-- 获得索引值 -->
<ul>
<li *ngFor = "let item of list2 ; let key=index">
{{key}}--{{item}}
</li>
</ul>
<!-- 稍微复杂点的循环 -->
<ul>
<li *ngFor = "let item of list3 ; let key=index">
{{key}} -- {{item.title}}
</li>
</ul> <!-- 复杂对象循环 -->
<ul>
<li *ngFor = "let item of list4 ;let key=index">
{{key}} -- {{item.username}}
<ol>
<li *ngFor="let value of item.list">
课程:{{value.course}} -- 成绩:{{value.source}}
</li>
</ol>
</li>
</ul>
<br><br>
<!-- 另外一种循环方式 -->
<!-- <p>另外一种循环方式</p>
<ul>
<li template= "ngFor let item of list3 ; let key=index">
{{key}} -- {{item.title}}
</li>
</ul> -->
6.事件绑定 双向绑定
想使用双向绑定,必须在app.module.ts中引入
import { FormsModule } from '@angular/forms';
并且在@ngModule中添加依赖
@NgModule({
declarations: [ // 自定义组件都需要引入,并且在里面配置
AppComponent, HeaderComponent, NewsComponent, HomeComponent
],
imports: [// 引入其他模块,当前项目依赖哪些模块
BrowserModule,
AppRoutingModule,
FormsModule
],
providers: [], // 定义的服务,放在里面
bootstrap: [AppComponent] //默认启动哪个组件
})
测试代码:
home.component.ts
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-home',
templateUrl: './home.component.html',
styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {
//定义成员变量
public msg : any;
public username:any;
public flag:any;
public count:any=0;
public search:any='';
constructor() {
this.msg='msg:这是一个home页';
this.username='thomas';
this.flag=false;
this.search='请输入值!';
}
//自定义方法1
getMsg(){
//获取属性的值
alert(this.msg);
}
//自定义方法2
setUsername() {
// tslint:disable-next-line: triple-equals
if(this.count %2==0){
this.username='chen';
}
else
{
this.username='thomas';
}
this.count++;
console.log(this.count);
}
setTrueFalse(){
if(this.count%2==0)
this.flag=true;
else
this.flag=false;
this.count++;
console.log(this.count);
}
keyupFunction(e){
alert(e.key);
}
public str:any='';
keyupSumFunction(e){
this.str+=e.key;
// alert(this.str);
}
ngOnInit() {
}
}
hoem.components.html
<h2>{{msg}}</h2>
<p>
home works!
</p>
<br>
<!-- // button执行函数 -->
<button (click)='getMsg()'>执行自定义方法</button>
<br><br>
username:{{username}}
<br>
<button (click)='setUsername()'>改变姓和名</button>
<br><br>
<!-- 演示ngif语句 -->
<button (click)='setTrueFalse()'>点击显示/隐藏</button>
<br>
<div *ngIf="flag">flag=true的情况下面显示</div>
<br><br>
显示每次按下的输入:
<input type="test" (keyup)='keyupFunction($event)'>
<br><br>
<h2>这个是事件绑定:</h2>
显示按下的字母的拼接:
<input type="test" (keyup)='keyupSumFunction($event)'>
{{str}}
<br>
<!-- 双向数据绑定 -->
<h2>这个是双向绑定</h2>
<input type='text' [(ngModel)]='search'/>
{{search}}
Angular4.x学习日志的更多相关文章
- GRE学习日志
发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...
- Cortex-M3学习日志(六) -- ADC实验
上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...
- Cortex-M3学习日志(五) -- DAC实验
终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...
- webpack2学习日志
webpack说容易也容易,说难也难,主要还是看个人,想学到什么样的程度,很多公司可能要求仅仅是会用就行,但是也有一些公司要求比较高,要懂一些底层的原理,所以还是要花一些时间的,看个人需求.这篇仅仅是 ...
- javascript学习日志:前言
javascript学习日志系列的所有博客,主要理论依据是<javascript权威指南>(犀牛书第6版)以及<javascript高级程序设计第三版>(红色书),目前js行业 ...
- MobileForm控件的使用方式-用.NET(C#)开发APP的学习日志
今天继续Smobiler开发APP的学习日志,这次是做一个title.toolbar.侧边栏三种效果 样式一 一. Toolbar 1. 目标样式 我们要实现上图中的效果 ...
- 我的游戏学习日志3——三国志GBA
我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...
- 【转】Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性
[转]Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性 Cocos2d-x 3.1.1 学习日志6--30分钟了解C++11新特性
- composer的安装和使用 学习日志
如果你做为一个phper,没有用过composer,那你真的不是一个合格的开发者.那么就来记录一下composer的学习日志 下面分享几个学习源头: composer中文网站:https://www. ...
随机推荐
- mybatis 在xml文件中获取当前时间的sql
在Service等地方获取当前时间: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日 ...
- github在README.md中插入图片
例子 
- SQLServer之创建不可重复读
创建不可重复读注意事项 语法:set transaction isolation level repeatable read. 指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都 ...
- mysql 基础sql语句
1.mysqladmin语句: # 查看mysql版本 mysqladmin version # 更改root用户密码 mysqladmin -u root -p原密码 password '新密码 ...
- DotNetCore + Sonar + Coverlet 代码覆盖率检查
一,下载 sonar-scanner-msbuild 我当前下载的最新版本是:sonar-scanner-msbuild-4.5.0.1761-netcoreapp2.0 https://docs.s ...
- python day08
ascii码转换成字符:ord(str) 字符串转换成ascii:chr(int) 三种字符串 1.普通字符串 --以字符作为输出单位 print(u'abc') 显示给用户看的字符串 2.二进制字符 ...
- kvm虚拟化介绍
一.虚拟化分类 1.虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相 ...
- redis 的过期策略都有哪些?内存淘汰机制都有哪些?
面试题 redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现? 面试官心理分析 如果你连这个问题都不知道,上来就懵了,回答不出来,那线上你写代码的时候,想当然的认为写进 r ...
- iOS 快捷下载和安装并使用CocoaPods
CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,手动一个个去下载所需类库十 ...
- PyCharm选中文件夹新建时Directory与Python package的区别
pycharm创建普通的directory和package时都是在硬盘上建立一个文件夹.但是建package时会在这个文件夹中自动地生成一个空的__init__.py文件.python的一个包是一个带 ...