码云链接: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学习日志的更多相关文章

  1. GRE学习日志

    发现开博客园真的很有督促作用,今天也顺便开个GRE学习日志吧 2015-02-09:单词 2015-02-10:单词 2015-02-11:单词 2015-03-02:阅读 2015-03-04:阅读 ...

  2. Cortex-M3学习日志(六) -- ADC实验

    上一次简单的总结了一下DAC方面的知识,好吧,这次再来总结一下ADC方面的东东.ADC即Analog-to-Digital Converter的缩写,指模/数转换器或者模拟/数字转换器.现实世界是由模 ...

  3. Cortex-M3学习日志(五) -- DAC实验

    终于逮了个忙里偷闲的机会,就再学一下LPC1768的外围功能吧,循序渐进是学习的基本规则,也许LPC1768的DAC与8位单片机16位单片机里面集成的DAC操作类似,但是既然这是懒猫的学习日志,就顺便 ...

  4. webpack2学习日志

    webpack说容易也容易,说难也难,主要还是看个人,想学到什么样的程度,很多公司可能要求仅仅是会用就行,但是也有一些公司要求比较高,要懂一些底层的原理,所以还是要花一些时间的,看个人需求.这篇仅仅是 ...

  5. javascript学习日志:前言

    javascript学习日志系列的所有博客,主要理论依据是<javascript权威指南>(犀牛书第6版)以及<javascript高级程序设计第三版>(红色书),目前js行业 ...

  6. MobileForm控件的使用方式-用.NET(C#)开发APP的学习日志

    今天继续Smobiler开发APP的学习日志,这次是做一个title.toolbar.侧边栏三种效果 样式一 一.          Toolbar 1.       目标样式 我们要实现上图中的效果 ...

  7. 我的游戏学习日志3——三国志GBA

    我的游戏学习日志3——三国志GBA 三国志GBA由日本光荣公司1991~1995所推出<三国志>系列游戏,该作是光荣在GBA上推出的<三国志>系列作品的第一款.本游戏登场武将总 ...

  8. 【转】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新特性

  9. composer的安装和使用 学习日志

    如果你做为一个phper,没有用过composer,那你真的不是一个合格的开发者.那么就来记录一下composer的学习日志 下面分享几个学习源头: composer中文网站:https://www. ...

随机推荐

  1. IDEA中的.iml文件和.idea文件夹

    .iml文件 iml文件是IntelliJ IDEA自动创建的模块文件,用于Java应用开发,存储一些模块开发相关的信息,比如一个Java组件,插件组件,Maven组件等等,还可能存储一些模块路径信息 ...

  2. dede二级导航

    {dede:channelartlist} {dede:field name='typeurl'/}'——{dede:field name='typename'/} {dede:channel typ ...

  3. mysql7笔记----存储过程实例

    mysql创建存储过程 DROP PROCEDURE IF EXISTS getCreateTimes /*前面要写DELIMITER $$ 或DELIMITER // */ DELIMITER $$ ...

  4. EM算法(Expectation Maximization)

    1 极大似然估计     假设有如图1的X所示的抽取的n个学生某门课程的成绩,又知学生的成绩符合高斯分布f(x|μ,σ2),求学生的成绩最符合哪种高斯分布,即μ和σ2最优值是什么? 图1 学生成绩的分 ...

  5. Java Web Token - JWT

    JWT认证过程:https://www.codetd.com/article/3602378 JWT官方文档:https://jwt.io/introduction/

  6. 【css】一行或者多行文字垂直水平居中

    1.方法一:使用css3弹性盒子(兼容IE10及以上浏览器,firefox,chrome,safari 5.1.7不支持) <!DOCTYPE html> <html> < ...

  7. jmeter(二十六)生成HTML性能测试报告

    性能测试工具Jmeter由于其体积小.使用方便.学习成本低等原因,在现在的性能测试过程中,使用率越来越高,但其本身也有一定的缺点,比如提供的测试结果可视化做的很一般. 不过从3.0版本开始,jmete ...

  8. 类LinkedList

    LinkedList特点 java.util.LinkedList 集合数据存储的结构是链表结构.方便元素添加.删除的.LinkedList是List的子类,List中的方法LinkedList都是可 ...

  9. git错集

    2018年12月20日22:26:01 fatal:not a git repository ( or any of the parent directories ) : .git 这个错误出现在首次 ...

  10. USB虚拟串口通信

    https://blog.csdn.net/errorhai/article/details/85333914