2009-07-24 10 views
0

Ich habe ein paar einfache Javascript, dass, soweit ich sagen kann sollte funktionieren, aber nicht.Rufen Sie eine JavaScript-Funktion von außerhalb seines Objekts

Der Code ist unter

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; 
} 

diesem Teil der Klasse Ajax.Net erzeugt ist.

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)); 
} ... 

Jede Hilfe wäre sehr geschätzt; Colin G

+0

„Funktioniert nicht“ ist nicht sehr Beleuchtung. Was soll es tun? Was tut es? Welche Fehler wirft es? – Quentin

+0

Bedenkt, dass Sie $ haben ('# LetterTypes'). Val(); in Ihrem Code - Verwenden Sie auch ein JavaScript-Framework? –

+0

@David Dorward sorrt dachte ich hätte die Fehlermeldung auf den Post gesetzt. editieren und für furture clairty hinzufügen – pythonandchips

Antwort

2

Der erste Parameter, der sein muss übergeben an Function.call() ist das Objekt, auf dem die Funktion aufgerufen wird. Dann folgen Sie den Funktionsparameter als separate Werte:

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

eine Funktion mit einer Reihe von Argumenten nennen Sie apply() verwenden sollten. apply() nimmt auch die Aufgabe, für die das Verfahren sollte als erster Parameter aufgerufen werden:

func.apply(someobj, params); 

in Ihrem Fall So wäre es etwa so aussehen:

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

var letters = ajaxCall(presenter.GetLetters, presenter, GetLettersParams); 
+0

Cheers sth als jetzt macht Sinn. Danke für die Erkundung – pythonandchips

1

Supertux richtig ist. Sie könnten versuchen, diese aus dem Zusammenhang, um sicherzustellen, für „Anruf“ gesetzt ist:

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; 
} 

Oder Sie könnten durch den Verzicht auf ajaxCall ganz die Dinge ein wenig vereinfachen:

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); 
} 
+0

Der Grund für die Erstellung der AjaxCall-Funktion ist es, die Vervielfältigung in Code im Javascript zu reduzieren. Einige meiner Seiten haben 10 Aufrufe an den Server und die aktuelle Funktionalität in der AjaxCall-Methode wird in jedem einzelnen kopiert. Ernsthaft benötigt Refactoring – pythonandchips

+0

Wenn Sie mehrere Anrufe haben, dann würden Sie sicherlich umgestalten wollen, aber haben Sie sich angeschaut, was AjaxCall tut? Es ist ein guter Ort für die Fehlerbehandlung, aber möchten Sie den Benutzer wirklich mit einer .NET-Fehlermeldung warnen? – Prestaul

+0

Wahr, ich möchte nicht. NET Fehler an den Client senden. Es gibt eine Menge von Validierungsregeln, die ich bedeute volle Client-Ausnahme mit allen anderen. NET-Fehler kommen mit einer Nachricht wie wenn es Kontakt Tech-Support-Typ-Sache mit einer Referenz-ID, die sich auf die Ausnahme-Protokoll bezieht. Möglicherweise nicht die beste Vorgehensweise, aber wäre an einer Alternative interessiert. – pythonandchips

Verwandte Themen