Angular2学习:Subject和Observable 文章标题

原文链接:http://blog.csdn.net/superpeepi_csdn/article/details/72673122


Subject是微信公众号,Observable是微信用户。

1个Subject可以对应n个不同的Observable,Observable只要向Subject要求接收,每次Subject的更新都能即时收到。

就如1个微信公众号可以有n个没用必然关系的微信用户,只要微信用户关注了微信公众号,每次微信公众号的更新都能及时收到。


以下的例子通过使用Subject和Observable,来取得http请求的response,并显示。


user-login.service.ts

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
import 'rxjs/Rx';

import { Http, Headers, Request, Response, RequestOptions, RequestMethod } from '@angular/http';
import { RequestArgs } from '@angular/http/src/interfaces';
import { UserModel } from '../user-model';

@Injectable()
export class UserLoginService {  
    //微信公众号(Subject)
    public subject: Subject<UserModel> = new Subject<UserModel>();

    constructor(public http:Http) {
        console.log("Angular2---------UserLoginService.constructor");
    }

    //给微信用户(Observable)关注提供的方法
    public get currentUser():Observable<UserModel>{
        return this.subject.asObservable();
    }

    public login(user: UserModel) {
        console.log("Angular2---------UserLoginService.login");

        let body = JSON.stringify(user);

        return this.http.post("http://172.28.197.13:8899/login", body)
        .map((response: Response) => {
            let userResponseJson = new UserModel();
            userResponseJson = response.json();
            //微信公众号(Subject)更新
            this.subject.next(Object.assign({}, userResponseJson));
            localStorage.setItem("currentUser",JSON.stringify(userResponseJson));

            if (userResponseJson && !userResponseJson.errCode) {
                console.log("Angular2---------UserLoginService.login SUCCESSED");
            } else {
                console.log("Angular2---------UserLoginService.login FAILED");
            }

            return response;

        })
        .subscribe(
                data => {
                    console.log("Angular2---------UserLoginService.login subscribe data : " + JSON.stringify(data.json()));
                },
                error => {
                    console.log("Angular2---------UserLoginService.login err");
                    console.error(error);
                }
        );

    }

}


user-login.component.ts

import { Component, OnInit } from '@angular/core';
import { UserLoginService } from './user-login.service';
import { UserModel } from '../user-model';

@Component({
  selector: '',
  templateUrl: './user-login.component.html',
  styleUrls: ['./user-login.component.css']
})
export class UserLoginComponent implements OnInit {
    public errorMessage: string = "";    
    public userModel: UserModel = new UserModel();
    public currentUser: UserModel;

    constructor(
        public userLoginService: UserLoginService
    ) {
        console.log("Angular2---------UserLoginComponent.constructor");
    }

    ngOnInit() {
        console.log("Angular2---------UserLoginComponent.ngOnInit");

        //执行微信用户(Observable)关注操作(就是那个[给微信用户(Observable)关注提供的方法])。
        //每次微信公众号(Subject)有更新,以下subscribe中的处理都会重复执行。
        this.userLoginService.currentUser
        .subscribe(
                data => {
                    this.currentUser = data;
                    console.log("Angular2---------UserLoginComponent.ngOnInit data : " + JSON.stringify(data));
                    if(this.currentUser) {
                        this.errorMessage = this.currentUser.errMsg;
                    }
                }
         )
    }

    public doLogin():void {
        console.log("Angular2---------UserLoginComponent.doLogin"); 
        this.userLoginService.login(this.userModel);

    }

}


html文件就省略了。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值