目标
从头构建一个 Angular 8 应用。
通过构建这个简单的计算器应用来体验 Angular 8。
前提
- 已经安装了 Node 和 NPM
- 已经安装了 Angular CLI 8
创建项目
$ ng new ngcalculator
会问你是否添加路由,你可以输入 N
,因为我们这个demo不需要路由功能。
然后会询问你想要使用哪种样式,选择 CSS
即可。
之后就是等待,需要等2分钟。
完成后就可以启动开发服务器了:
$ cd ./ngcalculator
$ ng serve
启动后可以访问项目:
创建组件
创建一个计算器组件,封装计算器界面和逻辑。
打开一个新的终端窗口(之前运行开发服务器的终端窗口不要关),进入项目目录,执行:
$ ng generate component calculator --skipTests
会在 src/app/calculator
目录下创建下面的文件:
-
src/app/calculator/calculator.component.css
CSS 样式文件 -
src/app/calculator/calculator.component.html
组件视图模板 -
src/app/calculator/calculator.component.ts
组件逻辑代码
打开 src/app/calculator/calculator.component.ts
,内容如下:
import { Component, OnInit } from '@angular/core';
@Component({
selector: 'app-calculator',
templateUrl: './calculator.component.html',
styleUrls: ['./calculator.component.css']
})
export class CalculatorComponent implements OnInit {
constructor() { }
ngOnInit() {
}
}
- selector
HTML 中引入组件时的标签名。
- templateUrl
模板的 HTML 文件路径。
- styleUrls
模板的样式文件路径,可以关联多个样式文件。
引用组件
打开src/app/app.component.html
,删掉现有的内容,添加:
<app-calculator></app-calculator>
查看 http://localhost:4200/,内容会自动刷新。
创建计算器组件的 UI
打开 src/app/calculator/calculator.component.html
,替换内容为:
<div class="calculator">
<input type="text" class="calculator-screen" value="0" disabled />
<div class="calculator-keys">
<button type="button" class="operator" value="+">+</button>
<button type="button" class="operator" value="-">-</button>
<button type="button" class="operator" value="*">×</button>
<button type="button" class="operator" value="/">÷</button>
<button type="button" value="7">7</button>
<button type="button" value="8">8</button>
<button type="button" value="9">9</button>
<button type="button" value="4">4</button>
<button type="button" value="5">5</button>
<button type="button" value="6">6</button>
<button type="button" value="1">1</button>
<button type="button" value="2">2</button>
<button type="button" value="3">3</button>
<button type="button" value="0">0</button>
<button type="button" class="decimal" value=".">.</button>
<button type="button" class="all-clear" value="all-clear">AC</button>
<button type="button" class="equal-sign" value="=">=</button>
</div>
</div>
打开 src/app/calculator/calculator.component.css
,替换内容为:
.calculator {
border: 1px solid #ccc;
border-radius: 5px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 400px;
}
.calculator-screen {
width: 100%;
font-size: 5rem;
height: 80px;
border: none;
background-color: #252525;
color: #fff;
text-align: right;
padding-right: 20px;
padding-left: 10px;
}
button {
height: 60px;
background-color: #fff;
border-radius: 3px;
border: 1px solid #c4c4c4;
background-color: transparent;
font-size: 2rem;
color: #333;
background-image: linear-gradient(to bottom,transparent,transparent 50%,rgba(0,0,0,.04));
box-shadow: inset 0 0 0 1px rgba(255,255,255,.05), inset 0 1px 0 0 rgba(255,255,255,.45), inset 0 -1px 0 0 rgba(255,255,255,.15), 0 1px 0 0 rgba(255,255,255,.15);
text-shadow: 0 1px rgba(255,255,255,.4);
}
button:hover {
background-color: #eaeaea;
}
.operator {
color: #337cac;
}
.all-clear {
background-color: #f0595f;
border-color: #b0353a;
color: #fff;
}
.all-clear:hover {
background-color: #f17377;
}
.equal-sign {
background-color: #2e86c0;
border-color: #337cac;
color: #fff;
height: 100%;
grid-area: 2 / 4 / 6 / 5;
}
.equal-sign:hover {
background-color: #4e9ed4;
}
.calculator-keys {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 20px;
padding: 20px;
}
添加一些全局样式,打开 src/styles.css
,添加:
html {
font-size: 62.5%;
box-sizing: border-box;
}
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: inherit;
}
查看页面,显示效果:

添加计算器处理逻辑
打开 src/app/calculator/calculator.component.ts
,添加组件的成员变量:
export class CalculatorComponent implements OnInit {
currentNumber = '0';
firstOperand = null;
operator = null;
waitForSecondNumber = false;
定义获取当前数字的方法:
public getNumber(v: string) {
console.log(v);
if (this.waitForSecondNumber) {
this.currentNumber = v;
this.waitForSecondNumber = false;
} else {
this.currentNumber === '0' ? this.currentNumber = v : this.currentNumber += v;
}
}
定义追加显示数字的方法:
getDecimal() {
if (!this.currentNumber.includes('.')) {
this.currentNumber += '.';
}
}
定义计算方法:
private doCalculation(op, secondOp) {
switch (op) {
case '+':
return this.firstOperand += secondOp;
case '-':
return this.firstOperand -= secondOp;
case '*':
return this.firstOperand *= secondOp;
case '/':
return this.firstOperand /= secondOp;
case '=':
return secondOp;
}
}
定义获取操作符的方法:
public getOperation(op: string) {
console.log(op);
if (this.firstOperand === null) {
this.firstOperand = Number(this.currentNumber);
} else if (this.operator) {
const result = this.doCalculation(this.operator, Number(this.currentNumber))
this.currentNumber = String(result);
this.firstOperand = result;
}
this.operator = op;
this.waitForSecondNumber = true;
console.log(this.firstOperand);
}
定义清除方法:
public clear() {
this.currentNumber = '0';
this.firstOperand = null;
this.operator = null;
this.waitForSecondNumber = false;
}
视图绑定
绑定显示区:
<div class="calculator">
<input type="text" class="calculator-screen" [value]="currentNumber" disabled />
<!-- [...] -->
绑定数字按钮事件:
<div class="calculator">
<input type="text" class="calculator-screen" [value]="currentNumber" disabled />
<div class="calculator-keys">
<!-- [...] -->
<button type="button" (click) = "getNumber('7')" value="7">7</button>
<button type="button" (click) = "getNumber('8')" value="8">8</button>
<button type="button" (click) = "getNumber('9')" value="9">9</button>
<button type="button" (click) = "getNumber('4')" value="4">4</button>
<button type="button" (click) = "getNumber('5')" value="5">5</button>
<button type="button" (click) = "getNumber('6')" value="6">6</button>
<button type="button" (click) = "getNumber('1')" value="1">1</button>
<button type="button" (click) = "getNumber('2')" value="2">2</button>
<button type="button" (click) = "getNumber('3')" value="3">3</button>
<button type="button" (click) = "getNumber('0')" value="0">0</button>
<!-- [...] -->
</div>
</div>
绑定操作符按钮事件:
<div class="calculator-keys">
<button type="button" (click) = "getOperation('+')" class="operator" value="+">+</button>
<button type="button" (click) = "getOperation('-')" class="operator" value="-">-</button>
<button type="button" (click) = "getOperation('*')" class="operator" value="*">×</button>
<button type="button" (click) = "getOperation('/')" class="operator" value="/">÷</button>
<!-- [...] -->
<button type="button" (click) = "getDecimal()" class="decimal" value=".">.</button>
<button type="button" (click) = "clear()" class="all-clear" value="all-clear">AC</button>
<button type="button" (click) = "getOperation('=')" class="equal-sign" value="=">=</button>
</div>
</div>
小结
计算器应用就完成了,可以到页面中体验一下。
参考:
网友评论