赞
踩
之前的笔记:
这是在学完了上面这三个内容后能够完成的项目,目前因为还没有学到数据在不同组件之前的传输,因此只会有一个 UI 的渲染,而不会涉及到事件的实现
wireframe 如下:
简单的说起来就是当前页面需要包含一个 Header,一个部分列举出所有的食谱(recipe),另外一个部分则列举出对应食谱的购物清单(shopping list)
虚线边框框起来的则是我认为的组件构成,将其转化成 Venn Diagram 则如下:
ingrident
和 recipe
为 Model,也就是 MVVM 中一直没讨论的部分(之前一直讨论的都是 VM 层和 V 层之间的互动)
根据需求也就可以开始下一步的实现了
主要通过 bash 实现:
❯ ng new recipe-book --no-strict --standalone false --routing false ❯ cd recipe-book # 在 angular.json 中配置对应的 bootstrap CSS 文件,第一篇笔记中有提 ❯ npm i bootstrap@3 ❯ ng g c header --skip-tests ❯ ng g c recipes --skip-tests ❯ ng g c recipes/recipe-list --skip-tests ❯ ng g c recipes/recipe-list/recipe-item --skip-tests ❯ ng g c shopping-list --skip-tests ❯ ng g c shopping-list/shopping-edit --skip-tests # 这是当前目录的结构 ❯ tree src/app/ src/app/ ├── app.component.css ├── app.component.html ├── app.component.spec.ts ├── app.component.ts ├── app.module.ts ├── header │ ├── header.component.css │ ├── header.component.html │ └── header.component.ts ├── recipes │ ├── recipe-detail │ │ ├── recipe-detail.component.css │ │ ├── recipe-detail.component.html │ │ └── recipe-detail.component.ts │ ├── recipe-list │ │ ├── recipe-item │ │ │ ├── recipe-item.component.css │ │ │ ├── recipe-item.component.html │ │ │ └── recipe-item.component.ts │ │ ├── recipe-list.component.css │ │ ├── recipe-list.component.html │ │ └── recipe-list.component.ts │ ├── recipes.component.css │ ├── recipes.component.html │ └── recipes.component.ts └── shopping-list ├── shopping-edit │ ├── shopping-edit.component.css │ ├── shopping-edit.component.html │ └── shopping-edit.component.ts ├── shopping-list.component.css ├── shopping-list.component.html └── shopping-list.component.ts 8 directories, 26 files
component 的创建主要则是根据上面提到的业务需求进行实现,目前还没有创建对应 Model 对应的文件
这里会用 bootstrap 内置的 class 实施不少功能,而 bootstrap 的部分不会细谈,主要还是针对 Angular 的学习
修改的部分为这里的 V 层:
src/app/
├── app.component.html
修改内容如下:
<app-header></app-header>
<div class="container">
<div class="row">
<div class="col-md-12">
<app-recipes></app-recipes>
<app-shopping-list></app-shopping-list>
</div>
</div>
</div>
这里主要提供的是一个结构,并且展示三大组件:header, recipe 和 shopping list
修改的部分为这里的 V 层:
src/app/
├── header
│ ├── header.component.html
实现如下:
<nav class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"> <a href="#" class="navbar-brand">Recipe Book</a> </div> <div class="collapse navbar-collapse"> <ul class="nav navbar-nav"> <li><a href="#">Recipes</a></li> <li><a href="#">Shopping List</a></li> </ul> <ul class="nav navbar-nav navbar-right"> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false" > Manage <span class="caret"></span> </a> <ul class="dropdown-menu"> <li><a href="#">Save Data</a></li> <li><a href="#">Fetch Data</a></li> </ul> </li> </ul> </div> </div> </nav>
这里全都是 bootstrap 就不多赘述了,实现后效果如下:
recipe 部分的结构通过上面的文件结构也能看出来了,简化一下如下:
├── recipes
│ ├── recipe-detail
│ ├── recipe-list
│ │ ├── recipe-item
│ ├── recipe.model.ts # 即将创建的 model
这个文件就是 recipes.component.html
这个文件,实现比较简单,只是导入 recipe-list 和当前选中的 recipe-detail:
<div class="row">
<div class="col-md-5">
<app-recipe-list></app-recipe-list>
</div>
<div class="col-md-7">
<app-recipe-detail></app-recipe-detail>
</div>
</div>
这个会让 recipe-list 和 recipe-detail 出现在同一行
接下来就可以处理细节了
这里主要就是定义了 recipe 应该有的数据,实现如下:
export class Recipe {
constructor(
public name: string,
public description: string,
public imagePath: string
) {}
}
这代表着 Recipe
对象会有名字、描述和图片三个属性
VM 层目前的逻辑也比较简单,它只需要存储一个 recipes 的数组,让 V 层可以渲染即可,代码如下:
import { Component } from '@angular/core'; import { Recipe } from '../recipe.model'; @Component({ selector: 'app-recipe-list', templateUrl: './recipe-list.component.html', styleUrl: './recipe-list.component.css', }) export class RecipeListComponent { recipes: Recipe[] = [ { name: 'Recipe 1', description: 'Description 1', imagePath: 'http://picsum.photos/200/200', }, { name: 'Recipe 2', description: 'Description 2', imagePath: 'http://picsum.photos/200/200', }, ]; }
这里没用 new Recipe()
创建也不会报错,本质上来说 TS 的类型检查是检查数据是否对的上,而不是真的会检查 a instanceof A
,而是做 a 有 name
, a 有 description
, a 有 imagePath
-> a 是 A
✅ 这样一个检查
⚠️:picsum.photos
是我在 placeimg.com
上找到的代替网站。placeimg.com
于去年年中正式关站了(
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。