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 尝试将其转换为一个长字符串。

我怎样才能实现这个功能仍然通过'item'作为字符串数组传递给命名函数?

如果传递命名函数是一个坏主意,有没有其他选择?

这就是我的控件的声明方式:

<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

我不确定你的总体计划是什么,但你可以传递函数而不是它们的名字:

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 回答
1

如果您的意图是将所有参数传递给传递给 formatItem() 的用户指定函数,则不要使用:

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

采用:

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

可以在函数对象上调用 apply() 方法,以便使用指定的“this”和参数数组调用该函数。有关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()]

...获得一个由其名称在“我”上定义的函数。(注意,如果 get_formatFunction() 返回字符串 'myFunc',那么这相当于 me.myFunc)

[编辑:将对“this”的引用改为使用“me”]

于 2009-10-09T16:39:36.620 回答