Angular2 - 关于功能范围的问题

时间:2017-02-09 10:31:17

标签: javascript angular

当我使用http模块制作Angular2示例时,我遇到了麻烦, 我基本上有这个(短样本)组件:

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);
                        console.log(this.result);
                        return this.result = res;
                    });
            console.log(this.result);
        }
    });

所以,这只是我的组件的片段。而且我在登录功能中访问本地变量时遇到问题。 如图所示,当代码运行以下函数时:

                 subscribe(function (res) {
                        console.log(this.result);
                        return this.result = res;
                    })

它得到了一个结果:'取消定义',这意味着' this.result'是不确定的,' this.result'不在loginComponent的构造函数中。 那么在这种情况下如何访问局部变量呢?

2 个答案:

答案 0 :(得分:0)

好的,当我查看Angular2资源代码时,我得到了一些灵​​感,我应该使用关键词'这个'更好。所以我改变了我的代码如下:

    constructor: [
        ng.http.Http,
        lazyResolveService(['app.loginService']),
        function (http,service) {
            var _self = this;
            _self.result = 'hello world';
            _self.httpService = http;
            _self.loginService = service;
            // this.loginService = app.loginServiceInjector.get(app.loginService);
        }
    ],

    login: function (username) {
        //this.loginService.printName(username);
        _self.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);
                    console.log(_self.result);
                    return _self.result = res;
                });
        console.log(_self.result);
    }

最后我得到了我想要的东西。

答案 1 :(得分:0)

更改您的订阅回调以添加binded方法

 .subscribe(function (res) {
                        console.log(res);
                        console.log(this.result);
                        return this.result = res;
                    }.bind(this));