Angular2 开发

本示例使用了Angular2 RC4版本,另外由于使用了bootstrap,所以需要html中引入对应的css及js文件

入口

import { bootstrap } from '@angular/platform-browser-dynamic';
import {myApp} from "./myApp";
import {HTTP_PROVIDERS} from "@angular/http";
bootstrap(myApp,[HTTP_PROVIDERS]).catch(err=>console.error(err));

这里由于要使用angular中的http所以需要在入口处先注入

服务

在此之前我们需要先定义DTO,由于我们传输DTO使用的是Json格式所以angular的DTO与webapi中DTO类型名称一致即可。

export interface groupDto {
 ID:string;
 GROUPNAME:string;
 norDER:number;
 PARENTID:string;
 GROUPTYPE:string;
 GROUPCODE:string;
}

下面将定义groupservice来从webapi中获取数据、更新数据

/** * Created by Administrator on 2016-06-30. */ import {Injectable} from "@angular/core";
import {Http,Headers} from "@angular/http";
import 'rxjs/Rx';
import {groupDto} from "./models/groupDto";
import {Observer,Observable} from "rxjs/Rx";
@Injectable()
export class groupservice{
 isSubmit:Observable<boolean>;
 private observer:Observer<boolean>;

 private _baseURL: string="http://localhost:23273/api/GroupList";
 constructor(private _http: Http) {
 this.isSubmit= new Observable<boolean>(observer=>this.observer=observer).share();
 }
 getGroupList() {

 return this._http.get(this._baseURL).map(responce => responce.json());
 }
 getGroup(id:string){
 return this._http.get(this._baseURL+"/"+id).map(responce => responce.json());
 }
 addGroup(item:groupDto){
 var json = JSON.stringify(item);
 var params = 'json=' + json;
 var headers = new Headers();
 headers.append('Content-Type','application/json');
 headers.append('Accept','application/json');

 return this._http.post(this._baseURL,JSON.stringify(item),{headers: headers}).subscribe(
 data=>{console.log(data);},err => {console.log(err);},() => {
 console.log("Complete");
 if(this.observer!==undefined)
 this.observer.next(true);

 }
 );
 }
 editGroup(id:string,item:groupDto){
 var json = JSON.stringify(item);
 var params = 'json=' + json;
 var headers = new Headers();
 headers.append('Content-Type','application/json');

 return this._http.put(this._baseURL+"/"+id,() => {
 console.log("Complete");
 if(this.observer!==undefined)
 this.observer.next(true);

 }
 );
 }
 delGroup(id:string){
 var headers = new Headers();
 headers.append('Content-Type','application/json');
 return this._http.delete(this._baseURL+"/"+id).subscribe(
 data=>{console.log(data)},err=>{console.log(err)},()=> {
 console.log("Complete");
 if (this.observer !== undefined)
 this.observer.next(true);
 }
 );
 }
}

这里可以看到这个服务申明了@Injectable()也就是说是可被注入的,在这个服务的构造中我们注入http服务,为了保证我们数据更新能够被其他组件检测到故在此还是用了观察模式(isSubmit),在数据更新后需要发布这个(isSubmit)变化,即可保证凡是订阅了该变化的组件都可及时进行数据处理。

这里重点需要注意在调用http传递参数时需要加入http的头部信息,指定参数格式为Json。

父组件定义

/** * Created by Administrator on 2016-06-30. */ import {Component,ViewChild} from "@angular/core";
import {groupservice} from "./group.Service";
import {groupDto} from "./models/groupDto";
import {addgroup} from "./addgroup.component";
import {ConfirmOptions} from "../components/confirm/confirmOptions.provider";
import {Confirm} from "../components/confirm/confirm.directive";
import {ConfirmPopover} from "../components/confirm/confirmPopover.component";
import {Position} from "../components/confirm/position.provider" import {PositionService} from "../components/confirm/position/position";
import {editgroup} from "./editgroup.component";
@Component(
 {
 selector:"group",templateUrl:"./app/curd/groupmanager.html",providers:[groupservice,ConfirmOptions,{provide: Position,useClass: PositionService}
 ],directives:[
 addgroup,Confirm,editgroup
 ],precompile: [
 ConfirmPopover
 ],}
)
export class group {
 @ViewChild('addGroupModal') addgroupmodal:addgroup;
 @ViewChild('editGroupModal') editgroupmodal:editgroup;
 groupdto:groupDto[];
 subscription:any;

 private data:Array<any> ;

 constructor(private groupservice:groupservice) {
 //this.length = this.data.length;  }
onAdd()
{
 this.addgroupmodal.open();
}
 onEdit(id:string){
 this.editgroupmodal.open(id);
 }
 ngOnInit() {
 this.groupservice.getGroupList().subscribe(p=> {
 this.groupdto = p;
 });

 this.subscription = this.groupservice.isSubmit.subscribe(status=> {
 if (status) {
 this.groupservice.getGroupList().subscribe(p=> {
 this.groupdto = p
 });
 }

 });
 //this.onChangeTable(this.config);  }

 ngOnDestroy() {
 this.subscription.unsubscribe();
 }

 onDel(id:string) {

 this.groupservice.delGroup(id);
 }

}

此处有一点复杂,在该组件中我使用了Modal窗口(单独的一个组件),即在新增、修改时弹出窗口进行数据编辑,同时在删除时我增加的提示信息,确认后才能实际进行删除操作。

Template

模板使用了单独的html文件

<div>
 <div class="btn-group">
 <button type="button" class="btn btn-default" (click)="onAdd()">新增部门</button>

 </div>
 <div>
<table class=" table table-striped table-bordered dataTable">
 <thead>
 <tr>
 <th>序号</th>
 <th >
 单位编号
 </th>
 <th>
 单位名称
 </th>
 <th>
 排序号
 </th>
 <th>
 操作
 </th>
 </tr>
 </thead>
 <tbody>
 <tr *ngFor="let item of groupdto ; let i = index">
 <td>{{i+1}}</td>
<td>{{item.GROUPCODE}}</td>
 <td>{{item.GROUPNAME}}</td>
 <td>{{item.norDER}}</td>
 <td>
 <button type="button" class="btn-danger"  mwl-confirm
 title="提示"  message="您确定要删除吗"  confirmText="确定"  cancelText="取消"  placement="left"  (confirm)="onDel(item.ID)"  (cancel)="cancelClicked = true"  confirmButtonType="danger"  cancelButtonType="default"  ><i class="icon-remove"></i></button>
 <button type="button" class="btn-info" (click)="onEdit(item.ID)"><i class="icon-edit-sign"></i></button>
 </td>
 </tr>
 </tbody>
</table>
 </div>

</div>
<div>
 <add-group #addGroupModal></add-group>
</div>
<div>
 <edit-group #editGroupModal></edit-group>
</div>

provider

providers中我引入了前面创建的服务,由于这是父组件在此处引入后,子组件在注入时就无需再引入groupservice,当然也可以在入口的bootstrap中注入,这样就无需再providers中引入了,具体差异见前面的学习资料。下面的ConfirmOptions和PositionService等都是用于提示框使用的服务。

Directives

在模板中使用了两个子组件(add-groupedit-group)所以需要在Directives中声明。

数据获取

本例中在组件加载时会调用groupsevice获取数据并加载,所以需要在ngOnInit中调用服务获取数据,同时订阅groupsevice中的isSubmit在其更新后再次调用服务获取数据以保障数据同步显示。

数据更新

这里使用了@ViewChild('addGroupModal') addgroupmodal:addgroup;

其中@ViewChild('addGroupModal') 与我们在模板中定义的子组件标签<add-group#addGroupModal></add-group>保持一致。
通过ViewChild的定义,下面我们就能使用子组件的方法弹出窗口。

onEdit(id:string){
this.editgroupmodal.open(id);
}

子组件

/** * Created by Administrator on 2016-07-11. */ import {Component,ViewChild} from "@angular/core";
import {groupservice} from "./group.Service";
import {FormBuilder,Control,Validators,ControlGroup} from "@angular/common";
import {groupDto} from "./models/groupDto";
import {MODAL_DIRECTIVES} from "../components/modal/ng2-bs3-modal";
import {ModalComponent} from "../components/modal/components/modal";
@Component({
 selector:"edit-group",templateUrl:"./app/curd/editgroup.html",directives: [MODAL_DIRECTIVES,ModalComponent ]
})
export class editgroup{
 groupdto:groupDto;
 groupCode:Control;
 groupName:Control;
 norder:Control;
 form: ControlGroup;
 subscription: any;
 constructor(private groupservice:groupservice,private builder: FormBuilder) {
 var obj={ID:"1",GROUPCODE:"",GROUPNAME:"",norDER:1,PARENTID:"",GROUPTYPE:""};
 this.groupdto=obj;
 this.groupCode = new Control('',Validators.compose([Validators.required,Validators.maxLength(10)]));
 this.groupName = new Control('',Validators.maxLength(20)]));
 this.norder=new Control('',Validators.required);
 this.form= builder.group({
 groupCode: this.groupCode,groupName: this.groupName,norder: this.norder  });
 }
 @ViewChild('myModal') modal: ModalComponent;

 close() {
 this.modal.close();
 }

 open(id:string) {
 this.groupservice.getGroup(id).subscribe(p=>{
 this.groupdto=p;
 })
 this.modal.open();
 }
 onSubmit(event){
 this.groupservice.editGroup(this.groupdto.ID,this.groupdto);
 this.modal.close();
 }
 ngOnInit(){

 this.subscription=this.groupservice.isSubmit.subscribe();


 }
 ngOnDestroy(){
 this.subscription.unsubscribe();
 }
}

模板

<modal #myModal>
 <modal-header>
 <h4 class="modal-title">编辑单位</h4>
 </modal-header>
 <modal-body>
 <form [ngFormModel]="form" (submit)="onSubmit(planetform.value)" #planetform="ngForm">
 <div class="form-group" >
 <label for="inputGroupCode">单位编号</label>
 <input type="text" class="form-control" id="inputGroupCode" placeholder="单位编号" ngControl="groupCode"  [(ngModel)]="groupdto.GROUPCODE"  >
 <div [hidden]="groupCode.valid || groupCode.pristine" class="alert alert-danger">
 单位编码不能为空或长度不能超过10个字符
 </div>

 </div>
 <div class="form-group">
 <label for="inputGroupName">单位名称</label>
 <input type="text" class="form-control" id="inputGroupName" placeholder="单位名称" ngControl="groupName"  [(ngModel)]="groupdto.GROUPNAME"  >
 <div [hidden]="groupName.valid || groupName.pristine" class="alert alert-danger">
 单位名称不能为空或长度不能超过20个字符
 </div>
 </div>
 <div class="form-group">
 <label for="exampleInputFile">排序码</label>
 <input type="number" id="exampleInputFile" ngControl="norder" [(ngModel)]="groupdto.norDER">
 </div>

 <button type="submit" class="btn btn-primary" [disabled]="!form.valid">提交</button>
 </form>
 </modal-body>
 <modal-footer>

 <button type="button" class="btn btn-primary" (click)="modal.close()">关闭</button>
 </modal-footer>
</modal>

这里可以看到使用的是bootstrap中的modal,所以注意要在首页html中要引入bootstrap及jquery。

在这个子组件中使用From中使用了数据验证,如果验证不通过([disabled]="!form.valid")则提交按钮不能使用。

<button type="submit" class="btn btn-primary" [disabled]="!form.valid">提交</button>

Form使用

此例中使用的angular2的formbuilder方式建立表单,所以需要在构造函数中注入

this.groupCode = new Control('',Validators.maxLength(10)]));

这里定义的groupCode使用了组合验证,与下面input中的ngControl名称一致,ngModel绑定的是实例化的Dto

<input type="text" class="form-control" id="inputGroupCode" placeholder="单位编号" ngControl="groupCode" [(ngModel)]="groupdto.GROUPCODE" >


最后上图片


实战Angular2+web api增删改查(三的更多相关文章

  1. HTML5新增form控件和表单属性实例代码详解

    这篇文章主要介绍了HTML5新增form控件和表单属性实例代码详解,需要的朋友可以参考下

  2. HTML5 WebSocket实现点对点聊天的示例代码

    这篇文章主要介绍了HTML5 WebSocket实现点对点聊天的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. HTML5表单验证特性(知识点小结)

    这篇文章主要介绍了HTML5表单验证特性的一些知识点,本文通过实例代码截图的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  4. amazeui页面分析之登录页面的示例代码

    这篇文章主要介绍了amazeui页面分析之登录页面的示例代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

  6. ios – 在Swift中将输入字段字符串转换为Int

    所以我非常擅长制作APP广告Swift,我试图在文本字段中做一些非常简单的输入,取值,然后将它们用作Int进行某些计算.但是’vardistance’有些东西不正确它是导致错误的最后一行代码.它说致命错误:无法解开Optional.None解决方法在你的例子中,距离是一个Int?否则称为可选的Int..toInt()返回Int?因为从String到Int的转换可能失败.请参阅以下示例:

  7. 如何在iOS中检测文本(字符串)语言?

    例如,给定以下字符串:我想检测每个声明的字符串中使用的语言.让我们假设已实现函数的签名是:如果没有检测到语言,则返回可选字符串.因此,适当的结果将是:有一个简单的方法来实现它吗?

  8. xamarin – 崩溃在AccountStore.Create().保存(e.Account,“);

    在Xamarin.Forms示例TodoAwsAuth中https://developer.xamarin.com/guides/xamarin-forms/web-services/authentication/oauth/成功登录后,在aOnAuthenticationCompleted事件中,应用程序在尝试保存到Xamarin.Auth时崩溃错误说不能对钥匙串说期待着寻求帮助.解决方法看看你

  9. ios – 将视频分享到Facebook

    我正在编写一个简单的测试应用程序,用于将视频从iOS上传到Facebook.由于FacebookSDK的所有文档都在Objective-C中,因此我发现很难在线找到有关如何使用Swift执行此操作的示例/教程.到目前为止我有这个在我的UI上放置一个共享按钮,但它看起来已禁用,从我读到的这是因为没有内容设置,但我看不出这是怎么可能的.我的getVideoURL()函数返回一个NSURL,它肯定包含视

  10. xcode – 错误“线程1:断点2.1”

    我正在研究RESTAPI管理器.这是一个错误,我无法解决它.我得到的错误在下面突出显示.当我打电话给这个班级获取资源时:我评论的线打印:Thread1:breakpoint2.1我需要修复错误的建议.任何建议都非常感谢解决方法您可能在不注意的情况下意外设置了断点.单击并拖动代表断路器外部断点的蓝色刻度线以将其擦除.

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部