1

特定のイベントでコントロールによって呼び出される独自のスクリプト名をユーザーが提供できるようにするユーザー コントロールがあります。

次のコードがあります。

initialize : function()
{

    // Call the base initialize method
    Point74.WebAutoComplete.callBaseMethod(this, 'initialize');

    $(document).ready(
        Function.createDelegate(this, this._onDocumentReady)
    );

},

_onDocumentReady : function()
{
    var me = this;
    $("#" + me.get_id()).autocomplete(me.get_ashxAddress(), 
        { 
            formatItem: function(item)
            {
                return eval(me.get_formatFunction() + "(" + item + ");");
            }
        } 
    ).result(me.get_selectFunction());
}

me.get_formatFunction には、関数の名前、つまり「FormatItem」が含まれます。この例は現在 eval を使用していますが、これは使用したくありません...さらに、この例はとにかく機能しませんが、何をしようとしているのかを示したいと思いました。

上記の例では、'item' が文字列配列であり、eval がそれを 1 つの長い文字列に変換しようとするため、値未定義エラーが発生します。

名前付き関数への文字列配列として「アイテム」を通過するこの機能を実現するにはどうすればよいですか

名前付き関数を渡すのが悪い考えである場合、代替手段はありますか?

これは私のコントロールが宣言されている方法です:

<p74:WebAutoComplete runat="server" ID="ato_Test" AshxAddress="WebServices/SearchService.ashx" 
     FormatFunction="formatItem" SelectFunction="searchSelectedMaster" />
4

3 に答える 3

3
me[me.get_formatFunction()](item);
于 2009-10-09T16:28:27.963 に答える
1

formatItem()に渡されるユーザー指定の関数にすべての引数を渡すことを目的としている場合は、次を使用する代わりに、次のようにします。

formatItem: function(item)
{
 return eval(me.get_formatFunction() + "(" + item + ");");
}

使用する:

formatItem: function()
{
 return me.get_formatFunction().apply(me, arguments));
}

指定された「this」と引数の配列を使用してその関数を呼び出すために、apply()メソッドを関数オブジェクトで呼び出すことができます。call()およびapply()関数の説明については、 http: //odetocode.com/blogs/scott/archive/2007/07/04/function-apply-and-function-call-in-javascript.aspxを参照してください。 javascriptで。

次に、get_formatFunction()で、関数の名前だけでなく、関数オブジェクトを返すようにします。または、次のことを試すことができます。

me[me.get_formatFunction()]

...「me」でその名前で定義されている関数を取得します。(get_formatFunction()が文字列'myFunc'を返す場合、これはme.myFuncと同等であることに注意してください)

[編集:'this'への参照を変更して'me'を代わりに使用する]

于 2009-10-09T16:39:36.620 に答える
1

全体的な計画が何であるかはわかりませんが、名前の代わりに関数を渡すことができます。

function Foo(x, y) {
  // do something
}

function Bar(f, a, b) {
  // call Foo(a,b)
  f(a,b);
}

Bar(Foo, 1, 2);
于 2009-10-09T16:25:12.873 に答える