代码之家  ›  专栏  ›  技术社区  ›  pythonandchips

从对象外部调用javascript函数

  •  0
  • pythonandchips  · 技术社区  · 15 年前

    我有一些简单的javascript,据我所知应该可以工作,但不能。

    代码如下

    var presenter = new Practicum.Web.TEI.StudentPlacement2009.CreateLetter_class(); //this is a class generated by Ajax.Net
    
    function GetLetters() {
        var GetLettersParams = new Object();
        GetLettersParams.TemplateType = $('#LetterTypes').val();
        var letters = ajaxCall(presenter.GetLetters, GetLettersParams);
        createOptions('Templates', letters, 'Id', 'Name', true);
    }
    
    function ajaxCall(ajaxMethod, parameters) {
        var response = ajaxMethod.call(parameters); //fails here with the message in
        if (response.error != null) {
            alert('An error has occured\r\n' + response.error.Message);
            return;
        }
        return response.value;
    }
    

    这是ajax.net生成的类的一部分。

    Practicum.Web.TEI.StudentPlacement2009.CreateLetter_class = function() {};
    Object.extend(Practicum.Web.TEI.StudentPlacement2009.CreateLetter_class.prototype, Object.extend(new AjaxPro.AjaxClass(), {
    GetLetterTypes: function() {
    return this.invoke("GetLetterTypes", {}, this.GetLetterTypes.getArguments().slice(0));
    },
    GetDegrees: function() {
    return this.invoke("GetDegrees", {}, this.GetDegrees.getArguments().slice(0));
    },
    GetLetters: function(getLettersParams) {
    return this.invoke("GetLetters", {"getLettersParams":getLettersParams}, this.GetLetters.getArguments().slice(1));
    } ...
    

    任何帮助都是很贴切的; 柯林G

    3 回复  |  直到 15 年前
        1
  •  2
  •   sth    15 年前

    需要传递给的第一个参数 Function.call() 调用函数的对象。然后将函数参数作为单独的值:

    func.call(someobj, param1, param2, ...);
    

    要使用参数数组调用函数,应使用 apply() . 应用程序() 还将应为其调用方法的对象作为第一个参数:

    func.apply(someobj, params);
    

    所以在你的例子中,它看起来是这样的:

    function ajaxCall(ajaxMethod, obj, parameters) {
      var response = ajaxMethod.call(obj, parameters);
      // ...
    }
    
    var letters = ajaxCall(presenter.GetLetters, presenter, GetLettersParams);
    
        2
  •  1
  •   Supertux    15 年前

    需要将对象传递给调用方法的第一个参数,例如:

    ajaxMethod.call(presenter, parameters);
    

    http://www.webreference.com/js/column26/call.html

        3
  •  1
  •   Prestaul    15 年前

    超级礼服是对的。您可以尝试此操作以确保为“call”设置上下文:

    function GetLetters() {
        var GetLettersParams = new Object();
        GetLettersParams.TemplateType = $('#LetterTypes').val();
        var letters = ajaxCall(presenter.GetLetters, presenter, GetLettersParams);
        createOptions('Templates', letters, 'Id', 'Name', true);
    }
    
    function ajaxCall(ajaxMethod, context, parameters) {
        var response = ajaxMethod.call(context, parameters); //Call requires a context
        if (response.error != null) {
            alert('An error has occured\r\n' + response.error.Message);
            return;
        }
        return response.value;
    }
    

    或者你可以通过不使用 ajaxCall :

    function GetLetters() {
        var GetLettersParams = { 
                TemplateType: $('#LetterTypes').val() 
            },
            response = presenter.GetLetters(GetLettersParams);
    
        if (response.error != null) {
            alert('An error has occured\r\n' + response.error.Message);
            return;
        }
    
        createOptions('Templates', response.value, 'Id', 'Name', true);
    }