问题
This is the widget I am trying to create. The goal is to have a stackContainer controlled by radio buttons at the top.
I have tried the example in the dojo documentation, but it has the same errant behavior.
define(["dojo/ready", "dojo/_base/declare", "dijit/_WidgetBase", "dojo/dom-construct",
"dojo/_base/lang", "dojo/on", "dojo/dom-attr", "dijit/form/RadioButton",
"dojo/dom-style", "dijit/layout/ContentPane", "dijit/layout/StackContainer",
"tcs/Log"],
function(ready, declare, _WidgetBase, domConstruct,
lang, on, attr, RadioButton,
style, ContentPane, StackContainer,
log) {
/**
* @class
* @name gijit.workflow.debug.combi
*/
return declare("gijit.workflow.debug.combi", [_WidgetBase], {
workflow : null,
panes : null,
width : "600px",
height : "400px",
_beforeCall : function(d) {
alert("beforeCall");
},
buildRendering : function() {
this.domNode = domConstruct.create("div", {id:"myform"});
var contain = domConstruct.create("div", null, this.domNode, "last");
var stackContainer = new StackContainer({
style: "height: " + this.height + "; width: " + this.width + "; border: 0px solid red"
}, contain);
var buttons = domConstruct.create("form", null, this.domNode, "first");
for(var i=0; i<this.panes.length; i++){
var contentPane = new ContentPane({
id : this.panes[i].title,
title : this.panes[i].title,
content : this.panes[i].content
})
stackContainer.addChild(contentPane);
var buttonDiv = domConstruct.create("span", null, buttons, "last");
style.set(buttonDiv, "display", "inline-block");
style.set(buttonDiv, "margin", "10px");
var label = domConstruct.create("div", {innerHTML: this.panes[i].title}, buttonDiv, "last");
if(i==0){
var RButton = new RadioButton({
title : this.panes[i].title,
showTitle : true,
checked : true,
value : this.panes[i].title,
name : "options",
onClick : function(a){stackContainer.selectChild(a.explicitOriginalTarget.attributes.value.textContent)}
}).placeAt(buttonDiv);
} else {
var RButton = new RadioButton({
title : this.panes[i].title,
showTitle : true,
checked : false,
value : this.panes[i].title,
name : "options",
onClick : function(a){stackContainer.selectChild(a.explicitOriginalTarget.attributes.value.textContent)}
}).placeAt(buttonDiv);
}
contentPane.resize();
contentPane.startup();
}
stackContainer.startup();
//Hacks in attempt to get the stuff to show
for(var i=0; i<stackContainer.getChildren().length; i++){
stackContainer.getChildren()[i].startup();
stackContainer.getChildren()[i].resize();
if(typeof stackContainer.getChildren()[i].getChildren()[0] === 'object'){
stackContainer.getChildren()[i].getChildren()[0].startup();
}
}
stackContainer.resize();
},
});
});
For the most part, it works. But in order to get anything to display I have to resize the window. All the reisizing/startup calls were added after it initially didn't work, but none of them do anything.
回答1:
If you are programmatically adding child widgets to your widget, you need to define a startup function that starts up the child widgets. That startup function then should be called whenever a new instance is created and placed in the dom. For example:
require(["dojo/ready", "dojo/_base/declare", "dijit/_WidgetBase", "dojo/dom-construct",
"dojo/_base/lang", "dojo/on", "dojo/dom-attr", "dijit/form/RadioButton",
"dojo/dom-style", "dijit/layout/ContentPane", "dijit/layout/StackContainer"],
function (ready, declare, _WidgetBase, domConstruct,
lang, on, attr, RadioButton,
style, ContentPane, StackContainer) {
var MyClass = declare("gijit.workflow.debug.combi", [_WidgetBase], {
startup: function () {
this.inherited(arguments);
stackContainer.startup();
}
});
var x = new MyClass({});
x.placeAt('node');
//manually call startup after instantiating the widget. If the parser is what is creating your widget, it calls startup automatically. startup must be called after the widget is in the dom.
x.startup();
console.log(x);
});
回答2:
Make your widget subclass of ContentPane rather than _WidgetBase to solve this issue, as ContentPanes know how to resize themselves
also see Sub-widgets won't render (will have 0 height) in Dojo
来源:https://stackoverflow.com/questions/14346998/dojo-stackcontainer-is-not-displaying-children-until-window-resize