2013-04-04 171 views
2

我正在尝试使用typescript,Knockout和azure移动服务来获取一些数据。问题是当我从azure获取数据时,它是异步的,我无法再获取viewmodel对象。我认为这是一些范围/关闭问题,请帮我找到解决方案。它在Done()的回调函数中为null;JavaScript和TypeScript范围问题

这里是我的打字稿代码:

class pmViewModel { 
    public welcomeMsg: string; 
    public totalCount: number; 
    constructor() { 
     this.welcomeMsg = ""; 
    } 
} 

class Manager { 
    client: any; 
    portalVM: pmViewModel; 
    constructor() { 
     this.client = new WindowsAzure.MobileServiceClient("url", "key"); 
     this.portalVM = new pmViewModel(); 
    } 

    LoadData() { 
     console.log("load data for management portal"); 
     this.portalVM.welcomeMsg = "Hello"; 
     this.portalVM.totalCount = 0; 
     var dataTable = this.client.getTable('dataTable'); 

     dataTable.take(1).includeTotalCount().read().done(this.populateTotal,this.portalVM); 

     ko.applyBindings(this.portalVM); 
     }; 

     populateTotal(result, vm) { 
      console.log(result); 
      console.log(vm); //null here 
      this.portalVM.totalCount = 100000;////this is also null 
     } 
} 

和生成的JavaScript代码:

var pmViewModel = (function() { 
    function pmViewModel() { 
     this.welcomeMsg = ""; 
    } 
    return pmViewModel; 
})(); 
var Manager = (function() { 
    function Manager() { 
     this.client = new WindowsAzure.MobileServiceClient("url", "key"); 
     this.portalVM = new pmViewModel(); 
    } 
    Manager.prototype.LoadData = function() { 
     console.log("load data for management portal"); 
     this.portalVM.welcomeMsg = "Hello"; 
     this.portalVM.totalCount = 0; 
     var dataTable = this.client.getTable('dataTable'); 
     dataTable.take(1).includeTotalCount().read().done(this.populateTotal, this.portalVM); 
     ko.applyBindings(this.portalVM); 
    }; 
    Manager.prototype.populateTotal = function (result, vm) { 
     console.log(result); 
     console.log(vm); 
     this.portalVM.totalCount = 100000; 
    }; 
    return Manager; 
})(); 
+0

你需要显示在错误发生。 – RobG 2013-04-04 02:56:30

+0

在完成方法回调(我在那里写了一些评论) – 2013-04-04 02:59:55

回答

2

相关线路的位置:

dataTable.take(1).includeTotalCount().read().done(this.populateTotal,this.portalVM); 

您需要捕获的 '这个' 结合因为它将在没有上下文的情况下作为回调被调用。

选项1:

[etc...].done((result, vm) => this.populateTotal(result, vm), this.portalVM); 

选项2:

[etc...].done(this.populateTotal.bind(this), this.portalVM); 
+0

您的解决方案看起来是正确的,但所有函数都有自己的上下文。问题在于* LoadData *的'this'值未设置为OP所期望的对象。 “this”的值由调用设置,这就是你所做的。 – RobG 2013-04-04 04:56:26

+0

谢谢,今晚我会试试 – 2013-04-04 17:10:51

+0

谢谢,它工作。我做了些微修改。 (结果)=> this.populateTotal(result),this.portalVm) populateTotal(result){ this.portalVm.totalCount = result.totalCount; ko.applyBindings(this.portalVm); } – 2013-04-04 23:03:01