Could we see an example of your debug output? That might give an
insight.
Also, it seems the subclass test could be simplified to:
childClass.prototype is lz.Pane
The 'is' operator understands mixins, whereas 'isPrototypeOf' does not.
On Jan 17, 2010, at 23:21, Rami Ojares / AMG <[email protected]>
wrote:
Hi Tucker,
When 4.7 was released the restructuring of tagname etc. forced me to
detect Pane tags as per your suggestion.
Currently I can“t get it to work.
Here's the situation:
I have a createChildren method overridden in SplitPane class
And from there I am calling the method you said would detect Pane
classes
(I only changed c.class to c['class'] because compiler told me to.
And I put the declaration
of variable outside of if statement)
Now the isPane seems to return false everytime.
Since I don't really understand what is going on in here I ask for
your guidance and assistance.
<method name="createChildren" args="children"><![CDATA[
var splitpaneChildren = [];
var paneCount = 0;
for(var i=0; i<children.length; i++) {
var pane = children[i];
var divider;
if (isPane(pane)) {
divider = {
'class': lz.Divider,
attrs: {
width: this.dividerWidth,
index: paneCount
}
};
// add index attribute also to Pane
pane.attrs.index = paneCount;
splitpaneChildren.push(divider);
splitpaneChildren.push(pane);
paneCount++;
}
else splitpaneChildren.push(pane);
}
super.createChildren(splitpaneChildren);
]]></method>
<method name="isPane" args="c"><![CDATA[
Debug.debug("c = %w", c);
var childClass;
if (c.name) childClass = lz[c.name];
else childClass = c['class'];
Debug.debug("childClass = %w", childClass);
var ret = lz['Pane'].prototype.isPrototypeOf
(childClass.prototype);
Debug.debug("returning %w", ret);
return ret;
]]></method>
- rami
If you are trying to detect instances of <Pane> (even anonymous
ones, which would be subclasses), the recommended approach would be
to use the `is` operator as above. But I see where your problem
lies, you are trying to sort the child "specifications" before they
have been instantiated. To be totally accurate, that means you
would have to look for `name` _or_ `class`, and that you would need
to know if the tag or class is a subclass of the tag's class you
are sorting on.
Something like:
function isPane(c) {
if (c.name) {
var childClass = lz[c.name];
} else {
var childClass = c.class;
}
return lz['Pane'].prototype.isPrototypeOf(childClass.prototype);
}
[That last line is pretty obscure, we should probably offer a built-
in `extends` or `isSubclassOf` predicate.]