0

actionscript と indesign SDK を使用した次のコードがあります。

私のクラスの初めに

 [ Embed (source= "resources/js/eventHandlers.jsx" , mimeType= "application/octet-stream" )]
        private static var jsHandler:Class;
        var  jsxInterface:HostObject = HostObject.getRoot(HostObject.extensions[0]);

私の機能では:

        jsxInterface.eval( new jsHandler().toString());
        jsxInterface.init( this );     
        document.xmlElements.item(0).xmlElements.item("docpreset").importXML(File.applicationStorageDirectory.resolvePath("temp/cstyles.xml"));
        jsxInterface.afterImport(document);

これは、eventHandlers.jsx 内のコードです。

var asInterface = {};
function init(wrapper) {
  asInterface = wrapper;
} 


function afterImport(document) {
    document.addEventListener (Document.AFTER_IMPORT, asInterface.test());
}

そしてjavascriptから私はこれを呼び出します:

public function test():void {
            trace("ole");
        }

これで、テスト関数が正しく実行されますが、その後、次に呼び出されるのは次のとおりです。

jsxInterface.afterImport(document);

そして、エラーがスローされます:

Error: ActionScript error: Error: Missing required parameter 'handler' for method 'addEventListener'.

何をする必要があるのか​​ もうわかりません。必要なのは、xml をインポートし、インポートが完了したときにイベントをディスパッチすることだけです。

javascript 関数を呼び出さなければならない理由がわかりません。また、通常の eventListener 内で document.AFTER_IMPORT を使用できません。誰でもこれについて私を助けてもらえますか?

4

2 に答える 2

1

問題は、afterImport()メソッドでイベントリスナーを正しく追加していないようです。

メソッドの 2 番目のパラメーターは、関数の名前addEventListener()にする必要があります (技術的には、関数への参照です)。あなたのコードでは、関数名の最後に括弧を付けています。つまり、関数への参照を提供する代わりに、関数が実行されています。

関数が実行されると、何も返されないため、2 番目のパラメーターaddEventListener()が欠落しており、エラーが発生します。

代わりにこれを試してください:

function afterImport(document) {
    document.addEventListener (Document.AFTER_IMPORT, asInterface.test);
    //                                           notice no "()" here  ^^
}

[編集]

まだエラーが発生しているため、コードを追加してさらにデバッグすることをお勧めします。

上記のメソッドで、addEventListener 行をコメントアウトし、次のように置き換えます。

    // for debugging
    if (asInterface.test == null)
    {
        trace("fail: it's null");
    }
    else if (asInterface.test is Function)
    {
        trace("success: it's a function");
        // this is the only code path where your error will not occur
    }
    else
    {
        trace("fail: i don't know what this is: ", asInterface.test);
    }
于 2012-06-15T11:41:41.720 に答える
0

次のようにASラッパーを開始する必要があると思います:

jsxInterface.init( this );

その後、AS API を js コードで使用できるようになります。

ロイック

于 2012-06-15T20:36:51.523 に答える