【问题标题】:How do I call a method from a class in compiled typescript?如何从已编译的打字稿中的类中调用方法?
【发布时间】:2017-04-28 00:08:33
【问题描述】:

我在 typescript 中创建了一些 API 帮助程序,以从 Microsoft Dynamics 2016 读取/写入数据。我需要从与 API 交互的页面中的 javascript 中调用这些帮助程序的方法。我似乎无法正确获取从 Web API 调用 Get() 方法的代码。我需要在我的$("#ExpenseButton").click 回调中放入什么代码来调用 Get() 方法?

从 Typescript 编译的 Javascript 代码

var WebAPI;
(function (WebAPI) {
    class ExpenseTransaction extends WebAPI.APIBase {
        constructor() {
            super();
        }
        ConvertToEntity(data) {
            let result = new Array();
            for (let i = 0; i < data.length; i++) {
                let newRecord = new Model.ExpenseTransaction();
                newRecord.ClientID = data[i]["_ccseq_clientid_value"];
                newRecord.ClientNumber = data[i]["ccseq_clientnumber"];
                newRecord.EmployeeFirstName = data[i]["ccseq_employeefirstname"];
                newRecord.EmployeeLastName = data[i]["ccseq_employeelastname"];
                newRecord.EmployeeID = data[i]["_ccseq_employeeid_value"];
                newRecord.ExpenseErrorCode = data[i]["ccseq_expenseerrorcode"];
                newRecord.GeneralLedgerName = data[i]["ccseq_generalledgername"];
                newRecord.GeneralLedgerNumber = data[i]["ccseq_generalledgernumber"];
                newRecord.GroupCode = data[i]["ccseq_groupcode"];
                newRecord.MasterCardPostedDate = data[i]["ccseq_mastercardposteddate"];
                newRecord.MasterCardTransactionDate = data[i]["ccseq_mastercardtransactiondate"];
                newRecord.MasterCardTransactionParentCompany = data[i]["ccseq_mastercardtransactionparentcompany"];
                newRecord.NAVCompanyCode = data[i]["ccseq_navcompanycode"];
                newRecord.NAVEmployeeID = data[i]["ccseq_navemployeeid"];
                newRecord.NAVGeographyCode = data[i]["ccseq_navgeographycode"];
                newRecord.NAVJobClassCode = data[i]["ccseq_navjobclasscode"];
                newRecord.NAVServiceCode = data[i]["ccseq_navservicecode"];
                newRecord.SetID = data[i]["_ccseq_setid_value"];
                newRecord.TransactionAmount = data[i]["ccseq_transactionamount"];
                newRecord.TransactionDate = data[i]["ccseq_transactiondate"];
                newRecord.TransactionDescription = data[i]["ccseq_transactiondescription"];
                newRecord.TransactionType = data[i]["ccseq_transactiontype"];
                newRecord.Vendor = data[i]["ccseq_vendor"];
                newRecord.StateCode = data[i]["statecode"];
                result[i] = newRecord;
            }
            return result;
        }
        Get(expenses) {
            if (Array.isArray(expenses)) {
                if (expenses[0] instanceof Model.ExpenseTransaction) {
                    return null;
                }
            }
            else {
                return Promise.resolve($.ajax({
                    url: this.Connection,
                    type: "GET",
                    contentType: "application/json",
                    dataType: "json",
                }));
            }
        }
        ;
        Create(expenses) {
            for (let i = 0; i < expenses.length; i++) {
                $.ajax({
                    url: this.Connection,
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    data: JSON.stringify(expenses[i].toJSON()),
                    success: function (data) {
                        alert("Success");
                    },
                    error: function (data) {
                        alert("error");
                    }
                });
            }
        }
        ;
    }
    WebAPI.ExpenseTransaction = ExpenseTransaction;
})(WebAPI || (WebAPI = {}));

页面的Javascript代码

(WebAPI || (WebAPI = {}));

$(document).ready(function () {
    setupHandlers();
});

function setupHandlers() {
    "use strict";

    $("#ExpenseButton").click(function () {
        // Put Code here
    });
}

我已经尝试过的代码

// Error: Uncaught TypeError: WebAPI.ExpenseTransaction is not a constructor
let ex = new WebAPI.ExpenseTransaction();

// Error: Uncaught ReferenceError: ExpenseTransaction is not defined
let ex = new ExpenseTransaction();

【问题讨论】:

  • 不应该只是new ExpenseTransaction(),没有WebAPI前缀吗?
  • @Yeysides - 得到Uncaught ReferenceError: ExpenseTransaction is not defined 错误
  • 嗯,您是否尝试将 WebAPI 声明为模块而不是 IIFE? stackoverflow.com/questions/13495107/…
  • 我选择了命名空间,因为我不想使用 RequireJS 之类的东西,但是基于 this 看起来 es6 现在原生支持模块,所以它可能值得再看看

标签: javascript typescript ecmascript-6


【解决方案1】:

我认为您必须创建 ExpenseTransaction 类的实例。

你可以试试这样的:

function setupHandlers() {
    "use strict";

    $("#ExpenseButton").click(function () {
        var expenseTransaction = new WebAPI.ExpenseTransaction();
        var expenses = null;
        expenseTransaction.Get(expenses).then(function() {
          alert('hello world');
        });
    });
}

您似乎没有自行调用将类添加到 WebAPI 的函数。

你可以试试这样的:

(function(WebAPI) {
  // YOUR TYPESCRIPT CODE

})(); <-- Invoke the anonymous function

您的 WebAPI 对象一定有问题。我在这里创建了您的代码的简化版本,它可以工作。

https://jsfiddle.net/jruizx/aru02gja/

【讨论】:

  • 我应该提到我已经尝试过了,抱歉。我收到错误Uncaught TypeError: WebAPI.ExpenseTransaction is not a constructor
  • @firelight 我认为您错过了对匿名函数的调用。
  • @firelight 你的 WebAPI 代码一定有问题,看看我在 jsfdiddle.net 中写的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 2021-08-08
  • 2023-04-09
  • 2013-04-15
  • 2016-03-01
相关资源
最近更新 更多