javascript - angular2 - http模块作用域问题

查看:75
本文介绍了javascript - angular2 - http模块作用域问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

最近在学习angular2,写demo时用到其中的http模块,代码如下

app.loginComponent =
    ng.core.Component({
        selector: 'login',
        templateUrl: 'app/login/login.html',
        providers:[lazyResolveService(['app.loginService'])]
    }).Class({
        constructor: [
            ng.http.Http,
            lazyResolveService(['app.loginService']),
            function (http,service) {
                this.result = 'hello world';
                this.httpService = http;
                this.loginService = service;
                // this.loginService = app.loginServiceInjector.get(app.loginService);
            }
        ],

        login: function (username) {
            //this.loginService.printName(username);
            this.httpService.get('http://localhost:8080/xxx/login')
                    .map(function (res) {
                         var str2 = JSON.parse(res._body);
                         return str2.message.securityMessage;
                    })
                    .subscribe(function (res) {
                        console.log(res);
                        return this.result = 'login';
                    });
            console.log(this.result);
        }
    });

在http.get处理到subscribe()这里代码:

                        console.log(res);
                        return this.result = 'login';

时,发现里面的this.result不是构造器里定义的this.result,而是subscribe()里自己重新定义的this.result,导致最后的console.log(this.result)一直输出‘hello world’.
请问怎么在http请求后的处理函数中获取构造器定义的变量?

解决方案

好吧,参考了一下源码后得到启发,构造函数改写如下:

       function (http,service) {
            var _self = this;
            _self.result = 'hello world';
            _self.httpService = http;
            _self.loginService = service;
            // this.loginService = app.loginServiceInjector.get(app.loginService);
        }

login函数改写如下:

        login: function (username) {
        var _self = this;
        //this.loginService.printName(username);
        this.httpService.get('http://localhost:8080/xxx/login')
                .map(function (res) {
                     var str2 = JSON.parse(res._body);
                     return str2.message.securityMessage;
                })
                .subscribe(function (res) {
                    console.log(_self.result);
                    return _self.result = 'login';
                });

两次运行login结果如下

第一次:'hello world';
第二次:'login'

证明在subscribe里运行的函数可以成功拿到app.loginComponent下的变量定义。
结论:要善于利用'this'!!!

这篇关于javascript - angular2 - http模块作用域问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆