2015-06-27 39 views
0

我有一个角服务返回的承诺。在我的控制器中,我想将值分配给控制器的“this”对象。在我的Visual Studio编辑器,它认为,“这”将是正确的对象,当我编辑(this.something显示在智能感知),但是当这个运行时,事情是不确定的,因为这是窗口对象。我究竟做错了什么?AngularJS与打字稿承诺-成功此目的是窗口

 this.webapi.getSites().success((data: Array<Isite>): void => { 
      this.something = data; // this becomes the window object so something is undefined. 
     }).error(function (error: any) { 
     }); 

与其他答案不同,它不是未定义的,它被设置为窗口对象。该transpiled代码如下所示:

topnav.prototype.loadSiteInfo = function() { 
     var _this = this; 
     this.webapi.getSites().success(function (data) { 
      _this.something = data; 
     }).error(function (error) { 
     }); 
    }; 

好像它应该工作,我...

+0

你没有做错什么,[这就是如何在JavaScript的作品(http://www.quirksmode.org/js/this.html):)这是一个常见的问题,[这个问题](http://stackoverflow.com/q/24145178/398606)有一个很好的解决方案(使用var self = this;')。 –

+1

[MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)有一个很好的说明也是如此。 –

+0

@SunilD。请注意,OP使用箭头运算符(又名词法分析范​​围解析运算符)。 Typescript在ES5模式下填充它。 – PSL

回答

0

原因

实例函数loadSiteinfo()没有被它的对象引用调用。所以函数中的“this”变量没有正确设置。

var instance = new topnav(); 

//this is right 
instance.loadSiteInfo() 

//this is wrong 
var f= instance.loadSiteInfo; 
f(); 

解决方案

你应该找到主叫功能和更改的方式loadSiteinfo是由它的对象引用所谓的逻辑。您可以通过将断点loadSiteInfo函数内找到主叫,并期待在调用堆栈在断点暂停执行。你可以在Chrome网上应用开发工具(F12)

+0

Loadsiteinfo是这样调用的:“this.loadSiteInfo();”它被定义为一个成员函数,如:“loadSiteInfo():void {}”,所以我相信它正确地使用实例变量。 –

+0

然后this.loadSiteInfo()中的“this”没有指向正确的对象。你应该在调用堆栈中追踪它。我建议你看看“this”是如何在JavaScript中工作的。 – Serguzest