动态调用extjs类中的函数

时间:2012-12-31 12:38:01

标签: javascript function extjs dynamic-dispatch

我有一个看起来像这样的ExtJs类:

Ext.define("RuleExecutor", {
    singleton: true,
    displayMessage: function(msg) {
        Ext.Msg.alert('Popup Message', msg[0]);
    },
    disableById: function(field) {
        Ext.getCmp(field).setDisabled(true);
    },
    //more functions are here...
});

现在我得到一个字符串=> str,其中包含我需要运行的方法名称。我需要在str

中的字符串指定的RuleExecutor 中调用该方法

正确调用该方法,但不传递参数。

像这样:

//arguments is an array
function RunRule(str, arguments) {
  //I tried this....
  var fn = RuleExecutor[str];
  fn(arguments)

  //This doesn't work either..
  RuleExecutor[str].apply(this, arguments);
}

2 个答案:

答案 0 :(得分:2)

不要将'arguments'用作变量名。在JavaScript中已经有一个类似于内置数组的对象,名为“arguments”。您的方法可能如下所示:

function RunRule(str) {
    var slice = Array.prototype.slice,
        args = slice.call(arguments, 1);
    RuleExecutor[str].apply(RuleExecutor, args);
}

我使用了'真实'数组原型中的slice方法。这一行:

args = slice.call(arguments, 1)

将除第一个之外的所有参数复制到args变量。你可以这样打RunRule

RunRule("displayMessage", "Hello");

答案 1 :(得分:1)

这是你要找的吗?

Ext.onReady(function () {
    Ext.define("RuleExecutor", {
        singleton: true,
        displayMessage: function (msg) {
            Ext.Msg.alert('Popup Message', msg[0]);
        },
        disableById: function (field) {
            Ext.getCmp(field).setDisabled(true);
        }
    });

    var str = 'displayMessage';
    RuleExecutor[str](['bar']);
});