为什么范围在这个Typescript / jscript代码中出错了

时间:2014-04-17 06:16:59

标签: javascript typescript

以下代码位于“视图”内,并且“范围”存在问题

打字稿:

getInvitations() {
        var invitationsUri = "/Api/Invitations/";

        $.ajax({
            url: invitationsUri ,
            type: 'GET',
            dataType: 'json',
            contentType: 'application/json'
        })
            .done((result) => {
                $.each(result, (index, item) => {
                    var invitation = new Invitation();
                    invitation.InvitationId(item.InvitationId);
                    invitation.Invited(true);
                    invitation.Email(item.Email);

                    this.Business.Invitations.push(invitation);
                });
            })
            .fail((x, y, z) => {
                alert(x + '\n' + y + '\n' + z + ' - failed to get invitations');
            });
    }

    getUsers() {
        var usersUri = "/Api/Users/";

        $.ajax({
            url: usersUri,
            type: 'GET',
            dataType: 'json',
            contentType: 'application/json'
        })
            .done((result) => {
                $.each(result, (index, item) => {
                    var user = new User();
                    user.Id(item.Id);
                    user.UserName(item.UserName);
                    user.Email(item.Email);

                    this.Business.Users.push(user);
                });
            })
            .fail((x, y, z) => {
                alert(x + '\n' + y + '\n' + z + ' - failed to get users');
            });
    }

第一种方法运作良好,第二种方法认为“这”指的是“项目”,因此它不认为“商业”是一种财产,因此没有实现目标。

任何想法可能会发生在这里?

编辑: 这是生成的代码(jscript)

BusinessView.prototype.getInvitations = function () {
        var _this = this;
        var invitationsUri = "/Api/Invitations/";

        $.ajax({
            url: invitationsUri,
            type: 'GET',
            dataType: 'json',
            contentType: 'application/json'
        }).done(function (result) {
            $.each(result, function (index, item) {
                var invitation = new Invitation();
                invitation.InvitationId(item.InvitationId);
                invitation.Invited(true);
                invitation.Email(item.Email);

                _this.Business.Invitations.push(invitation);
            });
        }).fail(function (x, y, z) {
            alert(x + '\n' + y + '\n' + z + ' - failed to get invitations');
        });
    };

    BusinessView.prototype.getUsers = function () {
        var _this = this;
        var usersUri = "/Api/Users/";

        $.ajax({
            url: usersUri,
            type: 'GET',
            dataType: 'json',
            contentType: 'application/json'
        }).done(function (result) {
            $.each(result, function (index, item) {
                var user = new User();
                user.Id(item.Id);
                user.UserName(item.UserName);
                user.Email(item.Email);

                _this.Business.Users.push(user);
            });
        }).fail(function (x, y, z) {
            alert(x + '\n' + y + '\n' + z + ' - failed to get users');
        });
    };

2 个答案:

答案 0 :(得分:0)

在jQuery .each()回调中,this始终由jQuery设置,因此它不会成为this在更高级别范围内的内容。如果您需要从更高级别的范围访问this的值,那么通常的解决方法是将其保存到该更高级别范围的本地变量,然后您可以从{ {1}}回调函数。

从您回答中包含的代码段中,您不清楚要访问的.each()值。您可能还需要知道调用常规函数(如调用this)会将getInvitations()指针更改为指向全局对象,或者将严格模式更改为thisundefined由javascript解释器根据函数调用的方式在每个函数调用中设置。

答案 1 :(得分:0)

你在每次调用中都得到了正确的lambda $.each(result, (index, item) => {你应该对函数定义做同样的事情,以确保thisgetInvitations = () => {和{getUsers = () => {和{ {1}}