如何将params传递给静态回调函数?

时间:2015-07-18 16:37:02

标签: actionscript-3 flash static callback static-methods

我有代码

MergeTool.as:

private static function askFromUser(cardId:uint, field:String, mainValue:*, addValue:*):void {

    WindowManager.instance.showQuestionPopup({
        message: "Client " + cardId + " has duplicate values. Do you want to replace" + mainValue + " to " + addValue,
        id:cardId,
        field:field,
        value:addValue
    }, okCallback);
}

private static function okCallback(p:*):void {
    trace("ok", p.message);
}

QuestionPopup.as:

private function onClick(event:MouseEvent):void {
    if(_ok) _ok.call(params);
}

当我按“是”时,它会出错:

错误#1063:core :: MergeTool $ / okCallback()上的参数计数不匹配。预计1,得到0。

但是,如果我使用带有0个参数的匿名回调 - 它可以正常工作:

        WindowManager.instance.showQuestionPopup({
        message: "Client " + cardId + " has duplicate values. Do you want to replace" + mainValue + " to " + addValue,
        id:cardId,
        field:field,
        value:addValue
    }, function (){
        trace("ok", this.message);
    });

它返回params对象,我传递给WindowManager.instance.showQuestionPopup(params,callback),我可以在匿名fucntion中使用“this”访问它。

我认为1变种并不会因为静态而烦恼。如何修复1个变体,因为2不直观?

1 个答案:

答案 0 :(得分:1)

function.call()方法不传递参数,参数是告诉对象this应该引用什么。

相反,您应该使用function.apply(context, parameter array)方法。它采用与call方法相同的第一个参数,但第二个参数采用Array,并将数组的每个元素作为参数应用于要调用的函数。所以对你来说,它应该是这样的:

private function onClick(event:MouseEvent):void {
    if(_ok != null) _ok.apply(this, [params]);
}

为了说明,假设您有以下需要3个参数的功能:

function test(p1:Number, p2Number, p3:Number){

}

以下两行完全相同:

test(1,2,3);

test.apply(this, [1,2,3]);