What about another approach? Maybe modules can have a two-step initialization: 1. If there are dependencies, those are loaded with a callback. 2. Once all the dependencies are loaded, the module is actually initialized and dispatches some events.
That way, the parent application does not need to know about the modules classes. > On Jun 30, 2019, at 11:59 AM, Carlos Rovira <[email protected]> wrote: > > Hi Alex, > > ok, then can we? > > 1.- *load the module (*but still not add it to app, so no start to run) > 2.- *inspect the classes loaded in the module* to know what of them > implements a concrete interface (let's call "IModuleInfo") > 3.- *set up script and link tags* but running IModuleInfo.setup() in all > classes in the module > 4.- *add the module* to parent so it can start running > > If that's ok, for me the tricky part is how to loop over the loaded classes > to know the ones that implements IModuleInfo and make a call to setup() > method. > > Point 2 and 3 could be PAYG so it could be added to the module as a bead. > > > El dom., 30 jun. 2019 a las 8:13, Alex Harui (<[email protected]>) > escribió: > >> The whole reason for inject_html is so some 3rd party JS can be loaded >> before Royale JS code starts using it. Because the loading of the >> 3rd-party code is a server request and possibly asynchronous, I don't think >> we want a pattern where the class that needs some 3rd party code tries to >> load that code in its initializers. That's not now it works in the main >> app, so I don't see why it has to work this way in the modules. Just have >> the module set up script tags to load the 3rd party JS before the module's >> JS gets loaded. >> >> My 2 cents, >> -Alex >> >> On 6/29/19, 3:27 PM, "Carlos Rovira" <[email protected]> wrote: >> >> Hi Alex, >> >> yes the solution is that, so to add dynamically a css or javascript I >> want >> to do the same way you did in UIModuleUtils.createLoader(), where you >> create a "link" element or a "script" element. >> What I really ask is how to trigger a method like that in (lets say) >> package.MyClass when a user uses that concrete class, and avoiding the >> user >> explicitly call that method (that's how I set up temporary in the blog >> example). >> >> if user wants to do in a Module this: >> >> import package.MyClass; MyClass; >> >> And the in some part uses just a public static var like this: >> >> var p:String = MyClass.SOME_PUBLIC_STATIC_VAR; >> >> I want Royale runs a function (that will be something like the part of >> the >> code in UIModuleUtils.createLoader(), where we create a "link" or >> "script" >> element and those get added to the html head. >> >> In the real world example the class is just a proxy to a Material >> Icons CSS >> and when using a classname and a text we get the icon. So in Royale, >> the >> user will just need to use the class as always in a binding or >> assignment >> using something like MyClass.SOME_PUBLIC_STATIC_VAR. And until now we >> was >> getting the CSS linked in the HTML thanks to compiler processing with >> inject_html directive. With Modules I don't see right now a way to do >> this >> in a transparent way for the user, and making him to add a call in his >> code, seems not a Royale way. That should be a framework call since is >> clear that tthe user is using a var just to print a text and get an >> icon. >> >> I think I have a solution for this: I remember in Flex days that we had >> something called MIXINS. If I recall correctly that MIXINGS was >> triggered >> in a class that implement Mixing interface and then SytemManager run a >> method in that class. I think we can do the same here. If you think is >> ok, >> to perform this, the solution could be that Module will hold >> automatically >> a registry of classes that implements a interface. Then when load we >> can >> call on the classes of that registry a method of the interface that >> will >> add the necessary "script" or "link" tags to html. If the class is >> used in >> Application, then inject_html does the right work, if is used in >> Module, >> when module loads it calls the method an solves the problem. >> >> What do you think? Don't see other way to solve this. >> >> >> El sáb., 29 jun. 2019 a las 8:19, Alex Harui (<[email protected] >>> ) >> escribió: >> >>> Take a look at UIModuleLoader and UIModuleUtils. Already it creates >>> several HTML script and link tags to load a js-debug module. The >> patterns >>> are already there to use as a template to load another script tag >> that will >>> add other script tags to the DOM or do just about anything you >> want. You >>> can manually code that additional JS file or have the compiler >> autogenerate >>> it from addtionalHTML. I don't think you want to generate HTML and >> write >>> it to innerHTML, but I could be wrong about that. >>> >>> In the compiler, the MXMLRoyalePublisher is where the inject_html >> data is >>> represented as additionalHTML and can be modified to be working JS. >>> >>> HTH, >>> -Alex >>> >>> On 6/28/19, 3:10 PM, "Carlos Rovira" <[email protected]> >> wrote: >>> >>> For watt you say, I'm more with the second part of your response >> where >>> we >>> can alter the compiler to modify the additionalHTML, but I think >> that >>> should be based on inject_html like we do in Application. I >> remember >>> that >>> this problem is less related to a loading of resources problem, >> that we >>> need to wait until the bytes was completely downloaded and we >> signaled >>> that >>> event. This is more an Annotation-metadata problem where we want >> that >>> if >>> the user *use* a class we want the html gets decorated with a >> line of >>> code, >>> and that should happen only once as currently happens when we >> use the >>> same >>> class in the Application. >>> >>> but If I try. to imagine how to do that, I don't get any idea, >> since >>> that >>> can be done like we do with main application. In this case, we >> only >>> can add >>> to the HTML once the user loads the module and that means can't >> be a >>> preprocess in the compiler like is actually in application >>> >>> >>> >>> >>> >>> >>> >>> El sáb., 29 jun. 2019 a las 0:01, Alex Harui >> (<[email protected] >>>> ) >>> escribió: >>> >>>> In a quick peek at the code, the ModuleLoader already loads >> more >>> than one >>>> file. It should be relatively simple to have a subclass or >> alternate >>>> ModuleLoaderWithPreloader that loads an additional file that >> loads >>> the >>>> third-party JS. >>>> >>>> Also, it appears that it should be relatively simple to alter >> the >>> compiler >>>> to take the additionalHTML and output it to be that additional >> file. >>>> >>>> -Alex >>>> >>>> On 6/27/19, 5:24 AM, "Carlos Rovira" <[email protected]> >>> wrote: >>>> >>>> I'm with you that we can make the compiler optimize the >> class >>> and just >>>> add >>>> the constants used, but I think that's is just an >> optimization >>> issue. A >>>> user will want to use constants this way. They even could >> create >>> a >>>> reduced >>>> class with just the constants he needs. >>>> >>>> About preloader, I'm interested in see how to do it. Maybe >> some >>> example >>>> from you and Yshay could be great to add to blog examples, >> I can >>> help >>>> with >>>> that If you want, if you provide an email with the code, or >>> prepare a >>>> project, I can do the rest. It would be good to all of us, >> so we >>> can >>>> learn >>>> how to do it. >>>> >>>> But as I stated before in my response to Alex, I don't >> think the >>>> preloader >>>> is the real problem in this case. Although we use a >> preloader, I >>> think >>>> we >>>> still need to solve the inject_html issue in modules don't >> you >>> think? >>>> >>>> >>>> >>>> El jue., 27 jun. 2019 a las 10:05, Harbs (< >> [email protected] >>>> ) >>>> escribió: >>>> >>>>> I also don’t know that abstracting this too much is a >> good >>> thing. >>>> It’s a >>>>> fair trade-off to require declaring external >> dependencies. It >>> also >>>> allows >>>>> for controlling where the dependencies are coming from, >>> versioning, >>>> etc. >>>>> >>>>> To me the pattern should be something like this: >>>>> >>>>> 1. Add a preloader bead to the app. >>>>> 2. Declare a list of dependencies for the preloader >> (which can >>>> control >>>>> where these dependencies are loaded from). >>>>> >>>>> In the case of something like MaterialIconType.SEARCH, I >> don’t >>> think >>>> the >>>>> MaterialIconType class should be included in the final >> app at >>> all if >>>> all >>>>> that’s used is some constants. I hope we eventually >> optimize >>> away all >>>>> constants in the compiler. >>>>> >>>>> Harbs >>>>> >>>>>> On Jun 27, 2019, at 10:29 AM, Alex Harui >>> <[email protected] >>>>> >>>>> wrote: >>>>>> >>>>>> I'm pretty sure in related threads I mentioned that a >>> preloader is >>>>> needed. >>>>>> >>>>>> -Alex >>>>>> >>>>>> On 6/26/19, 8:16 AM, "Carlos Rovira" < >>> [email protected]> >>>> wrote: >>>>>> >>>>>> Thanks Spiros, >>>>>> >>>>>> My real problem is the following. I'm trying to >> improve >>>> Modules. I >>>>> found >>>>>> that inject_html don't work with modules, >> Inject_html is >>>> processed by >>>>>> compiler. To solve in an easy way I'm trying to >> load CSS >>> and JS >>>> with >>>>>> javascript appending to head. >>>>>> >>>>>> When I load the module and I use a class that needs >> to >>> attach >>>> some >>>>> JS, I >>>>>> want to run a function like "loadJavascript" >>>>>> >>>>>> I created as well "loadCSS" (still not commited). >>>>>> >>>>>> The real use case I'm trying is to use >> MaterialIconType, >>> that >>>> was >>>>> using >>>>>> inject_html. I removed the inject_html directive, >>>>>> then added >>>>>> >>>>>> loadCSS(' >>>>> >>>> >>> >> https://nam04.safelinks.protection.outlook.com/?url=https%3A%2F%2Ffonts.googleapis.com%2Ficon%3Ffamily%3DMaterial%2BIcons&data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728139862&sdata=%2F%2FiVExFORoM2EZb6RAQ8YbQ9bm243SGXnGmZCRouJZM%3D&reserved=0 >>>> ' >>>>> ); >>>>>> >>>>>> in the constructor >>>>>> >>>>>> then in my real module I want just to use as always >>>>>> >>>>>> <js:FontIcon text="{MaterialIconType.SEARCH}" >>> material="true"/> >>>>>> >>>>>> accesing this way does not run the constructor, so >> the >>> loadCSS >>>> code >>>>> does >>>>>> not run :( >>>>>> >>>>>> >>>>>> We have hundreds of public static vars like >>>>>> >>>>>> public static const SEARCH:String = 'search'; >>>>>> >>>>>> So I think the current way you propose, although >> valid, >>> will >>>> not be >>>>> the >>>>>> best here, since will means lots of lines of code. >>>>>> >>>>>> But thanks for your suggestion >>>>>> >>>>>> Hope others could give as well some ideas on how to >> solve >>> this >>>>>> >>>>>> thanks >>>>>> >>>>>> >>>>>> >>>>>> El mié., 26 jun. 2019 a las 17:05, spiros (< >>> [email protected] >>>>> ) >>>>> escribió: >>>>>> >>>>>>> It is possible with static getter and seter. >>>>>>> >>>>>>> Maybe will help you the code below >>>>>>> >>>>>>> Spiros. >>>>>>> >>>>>>> public class Variable >>>>>>> { >>>>>>> >>>>>>> private static var _textData:String; >>>>>>> >>>>>>> public static function get >> textData():String >>>>>>> { >>>>>>> if( _textData ==null) >>>>>>> { >>>>>>> initailizeVariable(); >>>>>>> } >>>>>>> return _textData; >>>>>>> } >>>>>>> >>>>>>> public static function set >>>> textData(value:String):void >>>>>>> { >>>>>>> _textData = value; >>>>>>> } >>>>>>> >>>>>>> public static function >>> initailizeVariable():void >>>>>>> { >>>>>>> _textData = "The quick brown >> fox >>> jump over >>>> the >>>>>>> lazy dog."; >>>>>>> } >>>>>>> >>>>>>> >>>>>>> public function Variable() >>>>>>> { >>>>>>> } >>>>>>> } >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> -----Original Message----- >>>>>>> From: Carlos Rovira [mailto:[email protected]] >>>>>>> Sent: Wednesday, June 26, 2019 5:49 PM >>>>>>> To: [email protected] >>>>>>> Subject: Trying to run a function on a class that is >> not >>>> instantiated >>>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> I need to run a function when I access a public >> static var >>> in a >>>> class. >>>>>>> Trying to run the function in the constructor seems >> not to >>> work >>>> since >>>>>>> there's no instance of that class. Do we have some >> way to >>> do this? >>>>>>> >>>>>>> -- >>>>>>> Carlos Rovira >>>>>>> >>>>> >>>> >>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728139862&sdata=WgdK5dA3My%2BkuV5%2BbGqhP5QVZdEl4p0ae%2FB69YBV5YQ%3D&reserved=0 >>>>>>> >>>>>>> >>>>>> >>>>>> -- >>>>>> Carlos Rovira >>>>>> >>>>> >>>> >>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728139862&sdata=WgdK5dA3My%2BkuV5%2BbGqhP5QVZdEl4p0ae%2FB69YBV5YQ%3D&reserved=0 >>>>>> >>>>>> >>>>> >>>>> >>>> >>>> -- >>>> Carlos Rovira >>>> >>>> >>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728149855&sdata=nyev5XLQQy49d3rbRH4EXN4z1KYu0hTC4eSCRUIutHQ%3D&reserved=0 >>>> >>>> >>>> >>> >>> -- >>> Carlos Rovira >>> >>> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728149855&sdata=nyev5XLQQy49d3rbRH4EXN4z1KYu0hTC4eSCRUIutHQ%3D&reserved=0 >>> >>> >>> >> >> -- >> Carlos Rovira >> >> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728149855&sdata=nyev5XLQQy49d3rbRH4EXN4z1KYu0hTC4eSCRUIutHQ%3D&reserved=0 >> >> >> > > -- > Carlos Rovira > http://about.me/carlosrovira
