我有一个使用ArcGIS JS API和大量自定义小部件的Web应用程序。
如果我将esri/dijit/editing/TemplatePicker
放在“手风琴”容器选项卡中的ContentPane内(未激活),则在页面加载时,模板选择器无法正确呈现。
复制步骤:
现在通过设置selected="true"
<div data-dojo-type="dijit/layout/ContentPane" title="Heeh, this is a content pane" selected="true">
<div id="templatePickerDiv"></div>
</div>
selected="true"
窗口小部件现在可以正确加载。
这里到底发生了什么,我该如何解决?
答案 0 :(得分:1)
答案 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实现。