0

次のような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);
}
4

2 に答える 2

2

変数名として「引数」を使用しないでください。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");
于 2013-01-02T12:59:11.007 に答える
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']);
});
于 2012-12-31T16:22:28.657 に答える