首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rxjs最新的Rxjs问题

Rxjs最新的Rxjs问题
EN

Stack Overflow用户
提问于 2016-11-01 09:35:00
回答 2查看 354关注 0票数 1

你好,我正在尝试通过可观察的回电话更新signinText var。Iam在console.log中接收数据,但是数据在HTML中没有变化。this.fadeInputs()回调是成功的,但数据没有更新。

组件

代码语言:javascript
复制
import {Component, OnInit} from '@angular/core';
import {UserService} from "../services/user.service";
import {Observable} from "rxjs";
import {RequestUpload} from "../_Class/RequestUpload";
let request = require('request');

@Component({
    selector: 'app-login',
    templateUrl: './login.component.html',
    styleUrls: ['./login.component.css'],
    providers: [UserService]
})
export class LoginComponent implements OnInit {

    fade: boolean = false;
    signinText: string;

    constructor(private userService: UserService) {

    }

    ngOnInit() {
        this.fadeInputs(true);
        this.call('login/get','POST',{mobile:9000000000,password:1234},[],false).subscribe(
            (value) => {
                console.log(value);
                this.fadeInputs(false);
            },
            (err) => {
                console.log(err);
                this.fadeInputs(false);
            },
            () => {
                this.fadeInputs(false);
            }
        );
    }

    fadeInputs(fadeType: boolean) {
        console.log("Working");
        this.fade = fadeType;
        this.signinText = !this.fade ? "Sign In" : "Please Wait!";
    }


    private call(url: string, type: string, postData: {}, files: string[], cache: boolean) {
        url = "http://192.168.40.136:146/" + url;

        var RequestConfig = {};
        RequestConfig['method'] = type;
        RequestConfig['url'] = url;
        RequestConfig['auth'] = {
            'user': "admin",
            'pass': "1234"
        };

        let CheckFileSize = 0;
        if (type == "POST") {
            if (files.length > 0) {
                if (postData == null) {
                    postData = {};
                }
                let i = 0;
                for (let file of files) {
                    postData['file_' + i] = fs.createReadStream(file);
                    i++;
                    CheckFileSize += fs.statSync(file).size;
                }
            }
            if (postData != null) {
                RequestConfig['formData'] = postData;
            }
        }
        return Observable.create((observer) => {
            let r = request(RequestConfig, (error, response, body) => {
                if (error || response.statusCode != 200) {
                    observer.error({
                        error: error,
                        response: response,
                    });
                } else {
                    observer.next({response: response, body: body});
                    observer.complete()
                }
            }).on('drain', () => {
                observer.next({upload: new RequestUpload(r.req.connection.bytesWritten, CheckFileSize)});
            });
        })
    }

}

我尝试了下面的代码和它的工作。不知道“请求”模块有什么问题

代码下面的运行良好.

代码语言:javascript
复制
ngOnInit() {
    this.fadeInputs(true);
    Observable.create((observer) => {
        setInterval(() => {
            observer.next('check')
        }, 1000)
    }).subscribe(
        (value) => {
            this.fadeInputs(!this.fade);
        }
    )
}
EN

回答 2

Stack Overflow用户

发布于 2016-11-01 09:55:31

请求模块正在其他区域上运行。所以需要把它包裹到角度区域。

使用:

代码语言:javascript
复制
this.zone.run(() => {
// Your Code Here
})

感谢@GünterZ chbauer

代码语言:javascript
复制
constructor(private userService: UserService, private zone: NgZone) {

}
代码语言:javascript
复制
return Observable.create((observer) => {
    let r = request(RequestConfig, (error, response, body) => {
        this.zone.run(() => {
            if (error || response.statusCode != 200) {
                observer.error({
                    error: error,
                    response: response,
                });
            } else {
                observer.next({response: response, body: body});
                observer.complete()
            }
        })
    }).on('drain', () => {
        this.zone.run(() => {
            observer.next({upload: new RequestUpload(r.req.connection.bytesWritten, CheckFileSize)});
        })
    });
})
票数 1
EN

Stack Overflow用户

发布于 2016-11-01 09:57:00

request()似乎以某种方式离开了Angulars区域(这发生在使用异步API而不是由zone.js修补时)。

使用zone.run(...),可以将执行带回到Angulars区域,并且角将再次知道何时运行更改检测。

代码语言:javascript
复制
constructor(private zone:NgZone) { }

call(...) {
    return Observable.create((observer) => {
        let r = request(RequestConfig, (error, response, body) => {
          this.zone.run(() => {
            if (error || response.statusCode != 200) {
                observer.error({
                    error: error,
                    response: response,
                });
            } else {
                observer.next({response: response, body: body});
                observer.complete()
            }
          });
        }).on('drain', () => {
            observer.next({upload: new RequestUpload(r.req.connection.bytesWritten, CheckFileSize)});
        });
    })
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40357360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档