组合动画结束后如何执行动作?

时间:2013-02-06 19:48:48

标签: javascript dojo

我是Dojo世界的新手,所以这可能是一件令我困难的事情。

我有以下代码(删除不相关的东西):

define(["dojo/_base/declare", "dojo/fx", "dojo/on"],
    function (declare, fx, on) {
        return declare(null, {
            executeTransition: function (continuation) {
                var animation = fx.combine([
                    fx.slideTo({
                        duration: 1200,
                        node: this.node1, // node1 will be a valid node at the moment of execution
                        left: -this.node1.offsetWidth
                    }),
                    fx.slideTo({
                        duration: 1200,
                        node: this.node2, // node2 will be a valid node at the moment of execution
                        left: 0
                    })
                ]);

                on(animation, "End", continuation);

                animation.play();
            }
        });
    }
);

按原样执行我的代码时,on行无法说Uncaught Error: Target must be an event emitter。但作为一个动画,它应该是一个事件发射器吗?

我尝试解决问题的一些背景研究:

reference guide to dojo.fxfx.combine的结果视为任何其他动画。 API reference for dojo.fx仅表示它返回实例。

无论如何,Dojo 1.8 animation tutorial有一个我试图执行的相同例子,除了它后来将fx.combine的结果包装在fx.chain中(我不需要 - 或者我?)。

所以,我的问题是:使用Dojo 1.8,如何并行运行两个动画并在完成后执行一些代码?

1 个答案:

答案 0 :(得分:0)

在阅读完问题后,我决定进行调查。我发现,"目标必须是事件发射器" 错误仅在尝试从组合动画中捕获 onEnd 事件时发生。链式动画不会出现这种情况。

经过一番挖掘后,我注意到组合动画似乎有一个_connects属性,这表明它使用旧的折旧"dojo/_base/connect"功能。这可能是Dojo中的一个错误(或者更确切地说是在最近的升级中错过的代码)。看了Dojo Trac但还没找到任何东西,可能会为这个开一张新票。

我可以想到两种解决方法:

  1. 使用"dojo/_base/connect"

    connect.connect(animation, "onEnd", function(){
        // connect == dojo/base/connect
    })
    
  2. 直接连接到onEnd事件(或使用"dojo/aspect"

    animation.onEnd(function(){
    });
    
  3. 这两种方式都不是理想的,因为您可能需要在将来某个日期将代码更改为dojo/on版本。

    编辑:看起来其他人已将此报告为错误see here