Of course, my suggestion of using event.target.myXML.child(“foo”) will only 
work if we do not prepend _as3_.

Actually, prepending will break any use of XML methods for non-typed XML.

On Nov 16, 2015, at 10:51 AM, Harbs <harbs.li...@gmail.com> wrote:

> This seems like a partial solution. The thing with dot notation, is that you 
> can use anything — even elements that do not exist. You have a mismatch 
> between your xml and your code. In your example, xml.committer will return an 
> XMLList with two elements. xml.employee will return an XMLList with a 
> length() of 0. Unless we map the dot notation to child() in the compiler, we 
> will get a LOT of errors in existing E4X code. Checking xml.element.length() 
> is a very common way of checking that an element exists.
> 
> I guess we could use defineProperty for the cases when the Type of the XML is 
> not clear to the compiler, but even then, it will only work if the client 
> code is only checking elements which exist. It seems to me that consistently 
> failing on non-typed XML is easier to deal with then sometimes-yes- 
> sometimes-no access. But I could imagine others disagree.
> 
> FWIW, we can make the following recommendations:
> 
> 1. Use a local variable which has its type set for XML:
> var lis:XMLList = event.target.myXML;
> trace(list.foo);
> 2. Use type casting: trace((event.target.myXML as XMLList).foo); or 
> trace(XMLList(event.target.myXML).foo);
> 3. When the type is not defined, use .child(): 
> trace(event.target.myXML.child(“foo”));
> 
> On Nov 16, 2015, at 7:31 AM, Alex Harui <aha...@adobe.com> wrote:
> 
>> 
>> 
>> On 11/15/15, 7:55 AM, "Harbs" <harbs.li...@gmail.com> wrote:
>> 
>>> Right, but I don’t see any way around this. Simple property access will
>>> not work for the reasons I wrote above.
>> 
>> My thinking was that, for some XML like:
>> 
>> <project>
>> <committer id=“1”>
>>   <firstname>Alex</firstname>
>>   <lastname>Harui</lastname>
>> </committer >
>> < committer id=“2”>
>>   <firstname>Peter</firstname>
>>    <lastname>Ent</lastname>
>> </committer >
>> <product id=“1”>
>>   <name>Flex</name>
>> </product>
>> <product id=“2”>
>>   <name>FlexJS</name>
>> </product>
>> </project>
>> 
>> that you would instantiate an XML instance, and defineProperties employee
>> and product with getters that call child(“employee”) and child(“product”)
>> respectively.
>> 
>> The XMLList returned from child(“employee”) would have defineProperties
>> for “1”, “2”, and also “firstname” and “lastname”.
>> The XMLList returned from child(“product”) would have defineProperties for
>> “1”, “2”, and also “name”, which is why I was thinking we would want the
>> name() function to be _as3_name().
>> 
>> Of course, I could be missing something.  I always figured that XML and
>> XMLList use something like flash_proxy underneath, where it could detect
>> any reads and writes from an instance.  There is no such thing in JS as
>> far as I know, so the best we can do is defineProperties that we know we
>> need so we can detect reads and writes on them.
>> 
>> 
>> -Alex
>> 
>> 
>>> 
>>> 
>>> On Nov 15, 2015, at 5:49 PM, Alex Harui <aha...@adobe.com> wrote:
>>> 
>>>> The compiler does not know that myXML is from myClass so it would simply
>>>> add a property access to foo.  Now we could require that folks more
>>>> strongly type their code by adding in
>>>> 
>>>> trace((event.target.myXML as XMLList).foo);
>>>> 
>>>> 
>>>> But we might get complaints.  The fact we normally don’t need all that
>>>> casting is what can make AS more efficient than languages that require
>>>> the
>>>> casting like Java and C++.
>>> 
>> 
> 

Reply via email to