Dojo和Ajax - 渲染小部件

时间:2010-12-29 02:45:37

标签: javascript ajax dojo dijit.layout

我正在尝试将内容加载到特定html标记中的Dojo内容窗格中,而不是替换整个内容窗格。我正在加载的html包含一个标记定义的小部件,我想在加载新行时渲染它。

所以,我有一个通过ajax动态填充的表,即:

<body>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js" 
     djConfig="parseOnLoad: true, isDebug:true"></script>
  <div id="table-pane" dojoType="dijit.layout.ContentPane">
    <table class="test">
      <tbody>
        <tr><td>Name</td><td>Year</td><td>Age</td></tr>
        <tr>
          <td><span dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea">Mike</span>
          </td>
          <td>2010</td>
          <td>12</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>

<script>
var html ='<tr><td><span dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea">John</span></td><td>2011</td><td>22</td></tr>';
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.InlineEditBox");
dojo.require("dijit.form.Textarea");
dojo.addOnLoad(function(){
  pane = dijit.byId("table-pane");
  add_elem();
});
function add_elem(){
  var node = $(".test tr:last");
  node.after(html);
  dojo.addOnLoad(function(){
    //Here I want to initiate any widgets that haven't been initiated
    pane.buildRendering();
  });
}</script>

如何在新表格行中渲染Dojo​​小部件?

2 个答案:

答案 0 :(得分:3)

ContentPane将使用 setContent 在内容集中呈现小部件。如上所述,您可以在使用 dojoType 添加节点后将dojo解析器指向特定的DOM节点。但是,如果您在代码中执行所有操作,为什么不使用编程方法而不是声明方法?

使用你的例子,

<html>
  <body>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js" 
      djConfig="parseOnLoad: true, isDebug:true"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>

    <div id="table-pane" dojoType="dijit.layout.ContentPane">
      <table class="test">
        <tbody>
          <tr><td>Name</td><td>Year</td><td>Age</td></tr>
          <tr>
            <td><span dojoType="dijit.InlineEditBox" editor="dijit.form.Textarea">Mike</span>
            </td>
            <td>2010</td>
            <td>12</td>
          </tr>
        </tbody>
      </table>
    </div>

<script>
var html ='<tr><td><span id="target">John</span></td><td>2011</td><td>22</td></tr>';
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.InlineEditBox");
dojo.require("dijit.form.Textarea");
dojo.addOnLoad(function(){
    var node = $(".test tr:last");
    node.after(html);
    new dijit.InlineEditBox({
        editor: "dijit.form.Textarea",
        autoSave: true
      }, dojo.byId('target'));
});
</script>

  </body>
</html>

如果你正在使用Dojo,你也可以使用dojo.query而不是jQuery来定位和操作节点。前,

dojo.query(".test tr:last-child");

答案 1 :(得分:0)

这应该有帮助: dojo.parser.parse(domnode?)

但我认为像dijit.layout.contentpane这样的小部件会自动加载加载的dom-fragment。包含的小部件之前必须是dojo.required!