I’m a bit stumped here. We have externs for HTML and native javascript APIs. Right? How do I import these externs so these classes are recognized when using COMPILE::JS?
Actually, I just searched for DOMParser and createHTMLDocument. Neither searched turned anything up in FlexJS. So I’m wondering if I was wrong about having externs for this. On Nov 10, 2015, at 10:48 AM, Harbs <harbs.li...@gmail.com> wrote: > I’m going to have to do some fancy footwork to get this working. Flash > Builder is complaining that palyerglobal.swc already exists whe I try to > create an XML class in the default package. > > Any ideas on how to do this? > > On Nov 10, 2015, at 9:39 AM, Harbs <harbs.li...@gmail.com> wrote: > >> OK. This approach is different than the approach I started on, but it could >> be workable. >> >> I was going down the road where there would be a set of single new classes >> which would proxy to XML and Document in Flash and HTML respectively. You >> are suggesting we stick with XML and XMLList for Flash and create new JS >> versions with the same public API as XML and XMLList. >> >> Where would you go about creating those JS classes? Would I just out it in >> an “as” folder and wrap the whole class in a COMPILE::JS? Also, what package >> would this go into? I’m assuming none, since XML and XMLList are both top >> level classes. >> >> BTW, I need to read and write XML files, so yeah, converting to JSON is not >> an option. >> >> On Nov 10, 2015, at 1:28 AM, Alex Harui <aha...@adobe.com> wrote: >> >>> Renaming the thread >>> >>> On 11/9/15, 1:12 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>> >>>> Well, I’d be interested in your findings. >>>> >>>> If operator definitions is possible .. will be easier than . operators. >>>> If we allow single dot operators, it will be difficult to differentiate >>>> between E4X syntax and function calls. I’d really like to drop the () on >>>> length and some of the other methods… Those are a course for very common >>>> errors. >>> >>> Maybe we aren’t talking about the same thing, but let me explain in more >>> detail what I’m saying. >>> >>> Here is some E4x: >>> >>> var a:XML = new XML(\"<top attr1='cat'><child attr2='dog'><grandchild >>> attr3='fish'>text</grandchild></child></top>\”); >>> var b:XMLList = a..child; >>> var c:XMLList = a..grandchild.(@attr2 == 'fish'); >>> >>> >>> (It would be nice to have others add in their favorite or common scenarios >>> if they are different). >>> >>> The compiler already understands the “..” as well as the “@“. The way >>> Falcon and FalconJX works is that there is a parsing phase that takes your >>> source code and creates a tree of different kinds of nodes (ClassNodes, >>> FunctionNodes, FunctionCallNodes, OperatorNodes, >>> MemberAccessExpressionNodes, etc). Falcon then walks the tree and >>> converts these nodes to ABC. FalconJX walks the tree and outputs >>> JavaScript. >>> >>> I just ran a test and the above code was parsed into a tree where the “..” >>> was the operator for a MemberAccessExpression. The “@“ was converted into >>> a unary operator for an E4xFilter operator for another >>> MemberAccessExpression. This is good for FalconJX, because that means we >>> understand the semantics of this syntax and can then generate any >>> JavaScript we want. >>> >>> IMO, given that folks are already wishing for a more Spark and MX-like >>> component set, I think we should try to mimic as much of E4x as possible >>> as opposed to inventing a new API that folks would have to migrate to. >>> Performance-wise, I still think it would be worth everyone’s time to >>> convert XML to JSON, but there are probably folks who can’t move. >>> >>> Given that FlexJS leverages the concept of replacing abstractions, if you >>> create an XML and XMLList class in JavaScript and populate them with the >>> same APIs as ActionScript, lots of things should work. The FalconJX >>> compiler could easily be taught to convert “a..child” into >>> “a.descendants()”. If the JS version has an extra filter() function, then >>> FalconJX would convert >>> >>> a..grandchild.(@attr2 == 'fish’) >>> >>> into >>> >>> a.descendants().filter(function (node) { return >>> node.attribute(‘fish’).length() }) >>> >>> or something like that. >>> >>> I think the part of XML in ActionScript that isn’t practical to do in >>> JavaScript is handling change notifications. It might be possible to do >>> some of it for known properties but I think it would be fragile. >>> >>> For example: >>> >>> var d:XML = a..child[0]; >>> d.foo = <bar />; >>> >>> In ActionScript you can get a change notification when foo is assigned. >>> With a bunch of work, if we know you are setting “foo” (which we do know >>> in this case) I think we could use Object.defineProperty to define a >>> property on d. >>> >>> What we can’t easily do is: >>> >>> var d:XML = a..child[0]; >>> var s:String = “someRandomPropertyName”; >>> d[s] = <bar />; >>> >>> If we don’t know what ’s’ is, we can’t define properties early on the XML >>> node. I suppose with even more code we could generate code for that. >>> >>> BTW, for any sort of solution, we would have to know that “d” is XML and >>> not Object and that would require more careful type handling in the code >>> our customers write. If you have: >>> >>> >>> public class MyClass extends EventDispatcher >>> { >>> public var someProp:XML; >>> } >>> >>> Then in some other class you have: >>> >>> var instance:MyClass = new MyClass(); >>> instance.addEventListener(“someEvent”, myHandler); >>> >>> function myHandler(event:Event):void >>> { >>> event.target.someProp.foo = <newnode />; >>> } >>> >>> We have lost the notion that someProp is XML and not Object because >>> event.target is defined as Object and not MyClass. Folks will have to fix >>> up their code to be: >>> >>> (event.target as MyClass).someProp.foo = <newnode />; >>> >>> Which won’t be much fun and if you miss one, you won’t get a compile error. >>> >>> FWIW, we could probably put in a warning if you forget () on “length”, >>> again if we know that length is being access on an XML node and not Object. >>> >>> HTH, >>> -Alex >>> >>> >> >