我有一个用户控件,允许用户提供自己的脚本名称,这些脚本名称由控件在特定事件中调用。
我有以下代码:
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" />
答案 0 :(得分:3)
me[me.get_formatFunction()](item);
答案 1 :(得分:1)
我不确定你的整体计划是什么,但你可以传递自己的功能而不是他们的名字:
function Foo(x, y) {
// do something
}
function Bar(f, a, b) {
// call Foo(a,b)
f(a,b);
}
Bar(Foo, 1, 2);
答案 2 :(得分: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。
然后你会希望get_formatFunction()返回一个函数对象,而不仅仅是函数的名称;或者你可以尝试:
me[me.get_formatFunction()]
...获取一个由'name'定义的函数。 (注意,如果get_formatFunction()返回字符串'myFunc',那么这相当于me.myFunc)
[编辑:更改了对'this'的引用以改为使用'me']