Вызовите функцию JavaScript из-за пределов ее объекта - PullRequest
0 голосов
/ 24 июля 2009

У меня есть простой 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));
} ...

Любая помощь будет очень ценится;Колин Г

Ответы [ 3 ]

2 голосов
/ 24 июля 2009

Первый параметр, который необходимо передать в Function.call(), - это объект, для которого вызывается функция. Затем следуйте параметрам функции в виде отдельных значений:

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

Чтобы вызвать функцию с массивом аргументов, вы должны использовать apply(). apply() также принимает объект, для которого метод должен быть вызван в качестве первого параметра:

func.apply(someobj, params);

Так что в вашем случае это будет выглядеть примерно так:

function ajaxCall(ajaxMethod, obj, parameters) {
  var response = ajaxMethod.call(obj, parameters);
  // ...
}

var letters = ajaxCall(presenter.GetLetters, presenter, GetLettersParams);
1 голос
/ 24 июля 2009

Супертукс прав. Вы можете попробовать это, чтобы убедиться, что контекст установлен для «вызова»:

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);
}
1 голос
/ 24 июля 2009

Вам необходимо передать объект первому аргументу метода вызова, например:

ajaxMethod.call(presenter, parameters);

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

...