dojo的parser会把html节点根据所声明的类型(data-dojo-type)转化为相应的dijit组件的template(dojo类型的节点),并且会给这些相应的template赋上对应的id,属性等等,并且把组件的id注册到dijit.registry里。在注册到registry的过程中,如果没有显式的指定id,则registry会生成一个自增的id赋值给相应的组件,如果显式的指定id,则使用指定的id。如果对同一节点多次parse操作,并且这些节点中有指定id的情况,就会出现你说的这种情况,报的错应该是Tried to register widget with id==xxx but that id is already registered。如果想分步加载并且多次parse,可以加载一个节点parse一个节点。或者在代码中调用dijit组件的startup方法也可实现parse的同样效果。
你用的dojo都是老版本了, 现在都出1.10了, 在dojo1.8已后都已经采用了AMD模式, 做到了按需加载, 并dojo本身属于企业级应用的JS框架,为开发者提供大量UI、Tool、Ajax等类库,可以使开发者不用关注浏览器兼容性问题来开发系统。本身dojo的JS编程方式比较OO, 深入学习后, 你会发现你可以通过dojo来定义属于自己的UI库、模块库等,还是比较爽的。
缺点就是对HTML的侵入性比较严重, 目前还没有看到MVVM的加入, 学习资料很少很难入门。