如何在标记中使用扩展的dojo.dnd.Source类?

时间:2011-05-07 14:19:20

标签: dojo

下面的XHTML,对真实应用程序的大量简化,导致Firebug报告“无法加载类'my.dojo.dnd.Source”:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" >
<html xmlns="http://www.w3.org/1999/xhtml">

  <head>
    <meta http-equiv="Content-type" content="text/html;charset=UTF-8" />
    <style type="text/css">
      @import url("http://o.aolcdn.com/dojo/1.6/dojo/resources/dojo.css");
      @import url("http://o.aolcdn.com/dojo/1.6/dojo/resources/dnd.css");
    </style>
    <script type="text/javascript" src="http://o.aolcdn.com/dojo/1.6/dojo/dojo.xd.js" djConfig="parseOnLoad:true"></script>
    <script type="text/javascript">
      dojo.require("dojo.dnd.Source");
    </script>
    <script>
    // <![CDATA[
      dojo.ready(function()
      {
        dojo.provide("my.dojo.dnd.Source");
        dojo.declare("my.dojo.dnd.Source", dojo.dnd.Source,
        {
          markupFactory: function(params, node)
          {
            params._skipStartup = true;
            return new my.dojo.dnd.Source(node, params);
          }
        });
      });
    // ]]>
    </script>
  </head>

  <body>
    <ul dojoType="my.dojo.dnd.Source">
        <li class="dojoDndItem">foo</li>
    </ul>
  </body>

</html>

在真正的应用程序中,扩展程序当然有用。此外,在真实的应用程序中,ul实际上是table,其内容可能会被基于用户操作的Ajax调用重复呈现。对于这篇文章,我试图将问题排除在其基本要素之外。

我不确定是否需要markupFactory覆盖,但我看到它在其他示例中使用并认为可能是必要的。如果没有它,则报告相同的错误消息。

我怀疑是某个人在dojo.declare生效之前尝试加载扩展类。如果我在dojo.provide之外执行dojo.declaredojo.ready,我会收到消息dojo.dnd is undefined_43.clsInfo.cls.prototype is undefined,大概是因为dojo.require是异步的

如果不是说<ul dojoType="my.dojo.dnd.Source">我说<ul dojoType="dojo.dnd.Source">而是使用setAttributedojoType函数中设置onReady,那么错误消息就会消失。我不知道代码是否真正起作用。无论如何,由于Ajax重新渲染,这不会是一个可接受的解决方案,如上所述。

也许我错过了一些非常简单的事情。我将不胜感激任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

我通过以下方式终于得到了我想要的效果:

  • 将parseOnLoad设置为false而不是true。
  • 定义'reparse'函数,在适当的DOM节点上设置新的dojoType并重新分析相应的DOM子树(使用dojo.parser.parse)。
  • 在dojo.ready函数中调用reparse并在每次重新呈现Ajax之后调用。

请参阅 简单。