2009-07-24 14 views
0

私にはできる限りは動作するはずのシンプルなjavascriptがありますが、そうではありません。オブジェクトの外側からjavacript関数を呼び出す

コードは

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

+0

を非常にではありませんイルミネーション。それは何をすべきか?それは何をするためのものか?どのようなエラーがスローされますか? – Quentin

+0

$( '#LetterTypes')があることを考慮してください。あなたのコードに - JavaScriptフレームワークも使用していますか? –

+0

@David Dorward sorrtは、私が投稿にエラーメッセージを載せていると考えました。編集して盛り上がりを追加します – pythonandchips

答えて

2

にする必要がある最初のパラメータをあなたは、これはコンテキストが「コール」に設定されていることを確認しようとすることができ関数が呼び出されるオブジェクトはFunction.call()に渡されます。その後、別の値として関数のパラメータは次のとおり

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

あなたがapply()を使用する必要がある引数の配列を持つ関数を呼び出すには。だからあなたの場合には、それはこのようなものになります

func.apply(someobj, params); 

apply()もメソッドが最初のパラメータとして呼び出されるべき対象のオブジェクトを受け取り、「動かない」

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

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

今よりも気分が良い。 explinationのおかげで – pythonandchips

1

参照してください。

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

ajaxCall関数を作成する理由は、JavaScriptのコードの重複を減らすためです。私のページの中にはサーバーへの呼び出しが10件あり、ajaxCallメソッドの現在の機能がそれぞれにコピーされています。真剣にリファクタリングが必要 – pythonandchips

+0

複数のコールがある場合は、リファクタリングしたいと思うでしょうが、ajaxCallが何をしているのか見てきましたか?エラー処理には適していますが、実際に.NETエラーメッセージをユーザーに警告する必要がありますか? – Prestaul

+0

Trueクライアントに.netエラーを送信したくありません。それは例外ログに関連する参照IDを持つ技術サポートタイプのものに連絡し続ける場合のように、他のすべての.netエラーと一緒に私は完全なクライアント例外を意味する多くの検証ルールがあります。おそらくベストプラクティスではなく、代替案に興味があるかもしれません。 – pythonandchips

関連する問題