(终极篇章 一)实战中服务器通讯细节(http&webSocket)

想的和做的,差多了 —— 马丁路德.东

我们要在服务中使用HTTP服务并且还要异步的调用他的数据 怎么办?
1.首先我们要在自定义服务的构造函数中注入http服务

image.png

2.同样要异步操作就要引入

import 'rxjs/Rx'

3.公共服务上改造获取商品信息的方法,使他们可以接受异步的流。

getProducts(): Observable<Product[]> {
    return this.http.get('/api/products').map(res => res.json());
  }
  getProduct(id: number): Observable<Product>{
    return this.http.get('/api/product/' + id).map(res => res.json());
  }
  getCommentsForProductId(id: number): Observable<Comment[]>{
    return this.http.get('/api/product/' + id + '/comments').map(res => res.json());
  }

4.服务器上也有他们相应的方法
在这之前服务器已经有了一堆数据

export class Product {
    constructor(
        public  id:number,
        public  title:string,
        public  price:number,
        public rating:number,
        public desc:string,
        public categories:Array<string>){

    }
};
export class Comment {
    constructor(
        public id:number,
        public  productId:number,
        public  timestamp:string,
        public  user:string,
        public  rating: number,
        public  content :string
    ){

    }
};
const products: Product[] = [
    new Product(1,"第一个商品",1.99,3.5,"这是第一个商品,是我在学习慕课网angular时创建的",["电子产品","比特币"]),
    new Product(2,"第二个商品",5.99,3.5,"这是第二个商品,是我在学习慕课网angular时创建的",["电子产品","比特币"]),
    new Product(3,"第三个商品",2.99,4.5,"这是第三个商品,是我在学习慕课网angular时创建的",["电子产品"]),
    new Product(4,"第四个商品",1.99,3.5,"这是第四个商品,是我在学习慕课网angular时创建的",["电子产品","比特币"]),
    new Product(5,"第五个商品",6.99,1.5,"这是第五个商品,是我在学习慕课网angular时创建的",["电子产品","比特币"]),
    new Product(6,"第六个商品",6.99,5,"这是第五个商品,是我在学习慕课网angular时创建的",["电子产品","比特币"]),
];
const comments:Comment[] = [
    new Comment(1,1,"2017-02-02 20:20:22","老张0",1,"讲的还行1号"),
    new Comment(2,1,"2017-02-02 21:22:22","老张1",1,"讲的还行1号"),
    new Comment(2,1,"2017-02-02 21:22:22","老张1",1,"讲的还行1号"),
    new Comment(3,1,"2017-02-02 22:22:22","老张2",1,"讲的还行1号"),
    new Comment(4,2,"2017-02-02 23:22:22","老张3",1,"讲的还行2号"),
    new Comment(5,3,"2017-02-02 24:22:22","老张4",1,"讲的还行3号"),
    new Comment(5,6,"2017-02-02 24:22:22","老张4",1,"讲的还行6号"),
    new Comment(5,4,"2017-02-02 24:22:22","老张4",1,"难死了4号"),
    new Comment(5,5,"2017-02-02 24:22:22","老张4",1,"讲的还行5号"),
    new Comment(5,6,"2017-02-02 24:22:22","老张4",1,"讲的还行6号"),
];

服务器方法

app.get('/api/products',(req,res)=>{
  res.json(products);
});

app.get('/api/product/:id',(req,res)=>{
    res.json(products.find((product) => product.id == req.params.id));
    console.log("服务器已经接受到了商品详情请求");
});
app.get('/api/product/:id/comments',(req,res)=>{
    console.log("服务器已经接受到了商品评论列表请求");
    res.json(comments.filter((comment: Comment) => comment.productId == req.params.id));
});

5.1组件上面的控制器(通过注入依赖将服务引入)的改变,直接更改数据类型,然后async异步管道绑定

  private products: Observable<Product[]>;

在ngOnInit中承接数据

 this.products = this.productService.getProducts();
<div class="col-md-4 col-sm-4 col-lg-4" *ngFor="let product of products | async">
  <div class="thumbnail">
    <div class="caption">
      <h4 class="pull-right">{{product.price}}元</h4>
      <h4><a [routerLink]="['/product',product.id]">{{product.title}}</a></h4>
      <p>{{product.desc}}</p>
    </div>
    <div>
      <app-stars [rating]="product.rating"></app-stars>
    </div>
  </div>
</div>

5.2手工订阅方法(在组件中注入依赖之后直接订阅,不用第三个变量承接)

 this.productService.getProduct(productId).subscribe(
      product => {
        this.product = product;
        this.currentBid = product.price;
      }
    );

同时为了防止数据的undefined,在数据后面加上?

<div class="thumbnail">
  ![](http://upload-images.jianshu.io/upload_images/6331078-b7db1b23d9c58735?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  <div>
    <h4 class="pull-right">
      {{product?.price}}元
    </h4>
    <h4>
      {{product?.title}}
    </h4>
    <p>{{product?.desc}}</p>
  </div>
  <div>
    <p class="pull-right">{{comments?.length}}</p>
    <p>
      <app-stars [rating] ="product?.rating" ></app-stars>
    </p>
  </div>
</div>

5.3http请求的重定向
1.根目录下,新建proxy.con.json
代码如下

image.png

2.告诉angular启动时加上配置文件,修改package.json的start参数

image.png

3.更改发送路径

image.png

post(和本教程其他代码不重合)

image.png

只有当数据发生变化是才触发事件,用于用户优化体验

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容