码云链接: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. MVC 伪静态路由、MVC路由配置,实现伪静态。

    前段时间,研究了一下mvc路由配置伪静态,在网上扒了很多最后还是行不通,所以我现在把这些心得整理出来,供大家分享: 1.mvc中默认路由配置是:http://localhost:24409/Home/ ...

  2. ILRuntime入门笔记

    基础知识 官方地址:https://github.com/Ourpalm/ILRuntime 官方文档:https://ourpalm.github.io/ILRuntime/ 文档Markdown源 ...

  3. react-router(v4)

    概要 开发单页应用, 首先绕不开的内容就是路由, react router v4 版本是最新的版本. 和之前的版本相比, 成熟了很多, 也简单了很多, 使用起来更加方便. 核心 component r ...

  4. python3 购物车 增改查终极版~

    还是先来条NLP再说,快没了,以后想抄还没有... 十一,没有挫败,只有回应讯息 “挫败”只是指出过去的做法得不到预期的效果,是给我们需要改变的信号. “挫败”只是在事情画上句号时才能用上,欲想事情解 ...

  5. 基于IPv6的数据包分析(第三组)

    一.实验拓扑 二.配置过程 本处提供R1.R2.R4的详细配置过程(包含静态路由的配置) 1)      R1: R1(config)#int e1/0 R1(config-if)#ipv6 addr ...

  6. 【spring源码分析】IOC容器初始化(七)

    前言:在[spring源码分析]IOC容器初始化(六)中分析了从单例缓存中加载bean对象,由于篇幅原因其核心函数 FactoryBeanRegistrySupport#getObjectFromFa ...

  7. py文件2种执行方式

    import m1# print('模块导入执行', m1.num) # import sys# print(sys.path)import json# print(json) if __name__ ...

  8. Cordova入门系列(二)分析第一个helloworld项目 转发 https://www.cnblogs.com/lishuxue/p/6015420.html

    Cordova入门系列(二)分析第一个helloworld项目   版权声明:本文为博主原创文章,转载请注明出处 上一章我们介绍了如何创建一个cordova android项目,这章我们介绍一下创建的 ...

  9. antd pro 分支

    添加图片 这两种都可以 form表单问题 1 @Form.create() 这是绑定表单和组件,必须有,这样就能从this.props 中找到Form了 2 Select 要写initialValue ...

  10. VMware Workstation 14安装VMware Tools

    1 单击虚拟机,选择安装VMware Tools 2 此时会在桌面出现VWware Tools 3 双击进入 4 把*.tar.gz压缩文件cp到/home下 5 sudo tar -zvxf  *. ...