将Dojo小部件放置在非活动的手风琴容器中时,渲染不正确

时间:2018-08-16 14:33:14

标签: javascript dojo widget arcgis arcgis-js-api

我有一个使用ArcGIS JS API和大量自定义小部件的Web应用程序。 如果我将esri/dijit/editing/TemplatePicker放在“手风琴”容器选项卡中的ContentPane内(未激活),则在页面加载时,模板选择器无法正确呈现。

复制步骤:

  1. 加载小提琴(http://jsfiddle.net/n9jwtgko/1/
  2. 切换到第一个手风琴窗格。小部件只是一个没有内容的边框
  3. 现在通过设置selected="true"

    更改选定的窗格
    <div data-dojo-type="dijit/layout/ContentPane" title="Heeh, this is a content pane" selected="true">
        <div id="templatePickerDiv"></div>
    </div>
    
  4. 从第二个容器中删除selected="true"
  5. 刷新小提琴

窗口小部件现在可以正确加载。

这里到底发生了什么,我该如何解决?

3 个答案:

答案 0 :(得分:1)

有时我使用“ Dojo”会改变工作方式,但我不知道为什么。它以这种方式工作。代码结束后,“ parse.parse()”部分开始运行。

Here is fiddle

parser.parse();

答案 1 :(得分:0)

仔细查看HTML文件(使用autoSelect = true和不使用),可以看到没有autoselect = true时,您的网格无法获得正确的宽度。这是表格的HTML版本。如果看到元素“ dojoxGridHeader”,则宽度为0px,但与autoselect = true一样,它将变为“ width = 178px”。因此,检查CSS时,也可以在加载一致容器时使用grid.startup()。希望对您有所帮助。

<div hidefocus="hidefocus" role="grid" dojoattachevent="onmouseout:_mouseOut" tabindex="0" class="dojoxGrid grid" id="dojox_grid_DataGrid_0" align="left" widgetid="dojox_grid_DataGrid_0" aria-readonly="true" style="height: auto; width: 1px; user-select: none;">
    <div class="dojoxGridMasterHeader" dojoattachpoint="viewsHeaderNode" role="presentation" style="display: block; height: 0px;"><div class="dojoxGridHeader" dojoattachpoint="headerNode" role="presentation" style="display: none; width: 0px; left: 1px; top: 0px;">
        <div dojoattachpoint="headerNodeContainer" style="width:9000em" role="presentation">
            <div dojoattachpoint="headerContentNode" role="row"><table class="dojoxGridRowTable" border="0" cellspacing="0" cellpadding="0" role="presentation"><tbody><tr><th tabindex="-1" aria-readonly="true" role="columnheader" id="dojox_grid_DataGrid_0Hdr0" class="dojoxGridCell " idx="0" style="width:6em;"><div class="dojoxGridSortNode">cell0</div></th><th tabindex="-1" aria-readonly="true" role="columnheader" id="dojox_grid_DataGrid_0Hdr1" class="dojoxGridCell " idx="1" style="width:6em;"><div class="dojoxGridSortNode">cell1</div></th></tr><tr><th tabindex="-1" aria-readonly="true" role="columnheader" id="dojox_grid_DataGrid_0Hdr2" colspan="2" class="dojoxGridCell " idx="2" style=""><div class="dojoxGridSortNode">groupName</div></th></tr></tbody>

答案 2 :(得分:0)

问题似乎出在模板选择器或手风琴上。如果我从应用程序中删除了一个,它就可以正常工作,所以我的计划是确保解析器仅在一切完成后才运行,包括layers-add-result之类的事件。

由于我的应用程序已经模块化为mapLoader,小部件,服务等,因此我决定将mapLoader重构为延迟的对象。

define([/*...*/, function(){
    var init = function() {
       return $.when(function(){
                 //bootstrap map
                 //bootstrap widgets
                 //create new Deferred object
                 var dfd = $.Deferred();
                 function initEditing() {
                    /*hook up the rest*/
                    //resolve promise once the templatepicker is up and running
                    dfd.resolve();
                 }
                 //return promise
                 return dfd.promise();
              })
    };
    return {init: init}
}])

现在,就可以在启动文件中继续并调用:

define([
    "dojo/parser",
    "app/components/mapLoader.public",
    "dojo/domReady!"
], function (parser, MapLoader
) {
     //entry point into the application
     //authentication, configuration etc. omitted

     MapLoader.init().done(function () {
        parser.parse();
     });
});

这是我到目前为止发现确保解析器实际运行并执行其黑魔法之前确保每个小部件都已加载的唯一方法。现在,对于Ccourse,我只需要清理所有内容并将jQuery的递归对象替换为dojo实现。