上一篇 Angular2项目初体验-编写自己的第一个组件

  好了,前面简单介绍了Angular2的基本开发,并且写了一个非常简单的组件,这篇文章我们将要学会编写多个组件并且有主从关系

  现在,假设我们要做一个博客,博客的的文章具有主从关系,文章和文章详情;现在,我们新建一个Article的文件夹和其组件的基本架构(顺便说一下,我使用的是vs code 有个Angular2 fiels的插件,可以直接建立)

  效果如下

  

  我们需要显示博客,那就要建立一个blogdata的数据来源,这里为了方便我们直接采用本地变量的模式来做;为了保证功能单一性原则,我们新建一个data的文件夹,在里面建立Blog类

  

export class Blog{
id:number;
title:string;
}
export let BLOGS:Blog[]=[
{ id:1,title:"号外号外?奥巴马要下台啦"},
{ id:2,title:"什么?奥巴马要下台啦?"},
{ id:3,title:"号外号外?川普要上台了"},
{ id:4,title:"啥?我大四川人也要当美国总统了?"},
{ id:5,title:"mdzz,一群麻瓜,统统查杀"},
{ id:6,title:"首推龙文,必须出具"}
]

  然后在我们的Article组件中导入它

  

import { Component } from '@angular/core';
import {BLOGS,Blog} from '../data/blog'; @Component({
selector: 'ngarticle',
templateUrl: './article.component.html',
styleUrls:['./article.component.css']
}) export class ArticleComponent {
blogList:Blog[];
constructor()
{
this.blogList=BLOGS;
}
}

  由于article是html自带的标签,我们使用ngarticle作为选择器

  然后,我们开始编写我们的组件模板 article.component.html

  

<div class="article">
<ul class="articleList">
<li *ngFor="let blog of blogList">
<a>
{{blog.id}}:{{blog.title}}
</a>
</li>
</ul>
</div>

  

  接下来是article.component.css

.articleList {
list-style: none;
} .articleList li {
position: relative;
width: 100%;
font-size:16px;
border-bottom: 1px dashed #d9d9d9;
box-sizing: border-box;
border-radius:2px;
}
.articleList li > a {
position:relative;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding: 15px 25px;
display: block;
width: 100%;
color:#333;
height:100%;
}
.articleList li > span {
position:relative;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
padding: 15px 25px;
display: block;
color:#000;
height:100%;
background:69aa6f
}
.articleList li > a:hover {
color: #69aa6f;
transition: color 0.3s, box-shadow 0.3s;
}
.articleList li:hover {
background: #efefef;
}

  完成之后,在我们的app.component.html中使用它

  <ngarticle></ngarticle>

然后在命令行中进入项目根目录,使用ng serve命令执行,然后我们就得到了一个错误

错误显示我们的ngarticle是一个未知的组件,未知怎么办,注册嘛,所有的Angular组件都要注册(声明)之后才能使用,具体方法如下

  打开我们的App.Module.ts,我们像声明AppComponent一样声明我们的ArticleComponent,方法就是在declaration中添加我们的组件,这个declaration数组就是我们的组件声明的地方,所有的组件都需要在这里声明之后才可以使用

  

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { HttpModule } from '@angular/http'; import { AppComponent } from './app.component';
import { ArticleComponent } from './article/article.component'; @NgModule({
declarations: [
AppComponent,
ArticleComponent
],
imports: [
BrowserModule,
FormsModule,
HttpModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }

  到此,效果如下

  

  然后我们需要一个显示明细的东西,我们来做个显示明细编辑吧

  新建一个article-detail组件,和上边一样,文件夹

  articledetail.component.ts

  

import { Component, OnInit,Input } from '@angular/core';
import {BLOGS,Blog} from '../data/blog'; @Component({
selector: 'article-detail',
templateUrl: './articledetail.component.html',
styleUrls:['./articledetail.component.css']
}) export class ArticledetailComponent implements OnInit {
@Input() blog:Blog;
ngOnInit() { }
}

  这里我们注意到多了一个@Input()装饰器,这个是用来接受组件输入的,待会儿我们修改article.component.html的时候你就知道是干什么的了

  articledetail.component.html

  

<div class="articledetail" *ngIf="blog">
<h2>文章明细</h2>
<div class="content">
<div class="row">
<span >ID</span>
<span>{{blog.id}}</span>
</div>
<div class="row">
<span >Title</span>
<input type="text" class="myInput" [(ngModel)]="blog.title"/>
</div>
</div>
</div>

  这里用了*ngIf 值为blog,表示如果blog有值,为真,那么就显示内容,否则不显示

  我们注意到这里又多了一个[(ngModel)],简单就理解为input一类标签的值绑定,双向的哦

  articledetail.component.css

  

.articledetail {
margin:20px;
width: 100%;
margin: 0 auto;
}
h2{
text-align: center;
}
.row{
width: 100%;
padding: 10px 20px;
}
.row>span{
margin-left: 25px;
}
.myInput{
height: 36px;
line-height: 36px;
border: 0px;
border-bottom: 2px solid #000;
padding: 6px 12px;
box-shadow: 0px 5px 10px #ccc;
width: auto;
}

  因为加入了detail组件,我们先到app.module.ts中注册(声明)下,代码我就不贴了,大家都会了

  然后是修改刚才的article组件

  article.component.ts

  

import { Component } from '@angular/core';
import {BLOGS,Blog} from '../data/blog'; @Component({
selector: 'ngarticle',
templateUrl: './article.component.html',
styleUrls:['./article.component.css']
}) export class ArticleComponent {
blogList:Blog[];
selectedBlog:Blog;
constructor()
{
this.blogList=BLOGS;
}
selectBlog(blog:Blog)
{
this.selectedBlog=blog;
}
}

  然后是article.component.html

  

<div class="article">
<ul class="articleList">
<li *ngFor="let blog of blogList" (click)="selectBlog(blog)">
<a>
{{blog.id}}:{{blog.title}}
</a>
</li>
</ul>
<div>
<article-detail [blog]="selectedBlog"></article-detail> </div>
</div>

  

  我们看到article.component.ts中新增了一个属性selectedBlog,多了一个事件 selectBlog;这个事件通过(click)="selectBlog(blog)"绑定到了li标签的点击事件上,没错,Angular的点击事件就是这样么绑定的,然后我们在下方看到了我们的article-detail 组件的标签,里面有个 [blog]="selectedBlog",结合到刚才detail组件的@Input() blog:Blog 属性,我们就明白了,Input故名思议就是输入,可以接收父组件的参数;

  这里简单聊一聊[blog]类似的传值,[X]会将值绑定到组件或者单个标签的prototype(非attr)上,比如一个input标签有value 的prototy,我们也可以使用这样的绑定,你可以在article-detail组件中的input试一试,而这种绑定是单向的。由此,我们联想到刚才的[(ngModel)],好吧,其实[()]语法相当于两个语法,一个是[value]值绑定。一个是(input)事件的绑定;可以理解为

[ngModel]="blog.title"+(ngModelChange)="blog.title=$event";这两个事件更原始的模样是[value]="blog.title"+(input)="blog.title=$event.target.value",不过我们不用去关心Angular2帮我们做的这些事情,知道怎么用就行了吧

  行文到此,我们该来看下效果了

  

  结束语:到此我们可以完整得编写组件了,也知道了一些组件间的交互模式,嗨,也不知道多说些啥,下一篇文章我们将要了解Angular的服务

  更新ing。。。

  


  

  项目已经放到了gitbub上,地址 https://github.com/SeeSharply/LearnAngular

  本文章的提交 https://github.com/SeeSharply/LearnAngular/tree/a877676846b22b6dbe5430d02b01d25fb5463c61

  

  

Angular2入门系列教程3-多个组件,主从关系的更多相关文章

  1. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  2. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  3. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  4. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  5. Angular2入门系列教程2-项目初体验-编写自己的第一个组件

    上一篇 使用Angular-cli搭建Angular2开发环境 Angular2采用组件的编写模式,或者说,Angular2必须使用组件编写,没有组件,你甚至不能将Angular2项目启动起来 紧接着 ...

  6. Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境

    一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...

  7. ASP.NET MVC 入门系列教程

    ASP.NET MVC 入门系列教程 博客园ASP.NET MVC 技术专题 http://kb.cnblogs.com/zt/mvc/ 一个居于ASP.NET MVC Beta的系列入门文章,有朋友 ...

  8. Qt快速入门系列教程目录

    Qt快速入门系列教程目录

  9. Android视频录制从不入门到入门系列教程(一)————简介

    一.WHY Android SDK提供了MediaRecorder帮助开发者进行视频的录制,不过这个类很鸡肋,实际项目中应该很少用到它,最大的原因我觉得莫过于其输出的视频分辨率太有限了,满足不了项目的 ...

随机推荐

  1. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

  2. NodeJs之Path

    Path模块 NodeJs提供的Path模块,使得我们可以对文件路径进行简单的操作. API var path = require('path'); var path_str = '\\Users\\ ...

  3. html中如何添加提示信息

    提示:在标签中添加title属性 1.文本中如何添加提示信息? 1.1直接在标签中加title="值": 例如:<p title="爱笑,爱哭,爱生活"& ...

  4. 【开源】.Net Api开放接口文档网站

    开源地址:http://git.oschina.net/chejiangyi/ApiView 开源QQ群: .net 开源基础服务  238543768 ApiView .net api的接口文档查看 ...

  5. RabbitMq应用一的补充(RabbitMQ的应用场景)

    直接进入正题. 一.异步处理 场景:发送手机验证码,邮件 传统古老处理方式如下图 这个流程,全部在主线程完成,注册->入库->发送邮件->发送短信,由于都在主线程,所以要等待每一步完 ...

  6. 深入解析Sqlite的完美替代者,android数据库新王者——Realm

    写在前面: 又到一年一度七夕虐狗节,看着大家忍受着各种朋友圈和QQ空间还有现实生活中的轮番轰炸,我实在不忍心再在这里给大家补刀,所以我觉得今天不虐狗,继续给大家分享有用的. 如果你比较关心androi ...

  7. 个人网站对xss跨站脚本攻击(重点是富文本编辑器情况)和sql注入攻击的防范

    昨天本博客受到了xss跨站脚本注入攻击,3分钟攻陷--其实攻击者进攻的手法很简单,没啥技术含量.只能感叹自己之前竟然完全没防范. 这是数据库里留下的一些记录.最后那人弄了一个无限循环弹出框的脚本,估计 ...

  8. CSS 3学习——transition 过渡

    以下内容根据官方规范翻译以及自己的理解整理. 1.介绍 这篇文档介绍能够实现隐式过渡的CSS新特性.文档中介绍的CSS新特性描述了CSS属性的值如何在给定的时间内平滑地从一个值变为另一个值. 2.过渡 ...

  9. log4net使用手册

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  10. 微信小程序开发—快速掌握组件及API的方法

    微信小程序框架为开发者提供了一系列的组件和API接口. 组件主要完成小程序的视图部分,例如文字.图片显示.API主要完成逻辑功能,例如网络请求.数据存储.音视频播放控制,以及微信开放的微信登录.微信支 ...