2

我是 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. 但是作为一个动画,它应该已经是一个事件发射器了吗?

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

dojo.fx的参考指南将其结果fx.combine视为任何其他动画。dojo.fx的API 参考仅声明它返回一个实例。

无论如何,Dojo 1.8 动画教程与我尝试执行的示例完全相同,只是它稍后将 fx.combine 的结果包装在 fx.chain 中(我不需要 - 或者我不需要?)。

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

4

1 回答 1

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(){
    });
    

这两种方式都不是理想的,因为您可能必须在将来的某个日期将代码更改为dojo/on版本。

编辑:看起来其他人已经将此报告为错误,请参见此处

于 2013-02-07T13:07:21.720 回答