繁体   English   中英

JavaScript和TypeScript范围问题

[英]JavaScript and TypeScript scope issue

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

这是我的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;
})();

这里的相关行:

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

你需要捕获populateTotal的'this'绑定,因为它将被调用为没有上下文的回调。

选项1:

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

选项2:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM