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&amp;data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728139862&amp;sdata=%2F%2FiVExFORoM2EZb6RAQ8YbQ9bm243SGXnGmZCRouJZM%3D&amp;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&amp;data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728139862&amp;sdata=WgdK5dA3My%2BkuV5%2BbGqhP5QVZdEl4p0ae%2FB69YBV5YQ%3D&amp;reserved=0
>>>>>>> 
>>>>>>> 
>>>>>> 
>>>>>>   --
>>>>>>   Carlos Rovira
>>>>>> 
>>>>> 
>>>> 
>>> 
>> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&amp;data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728139862&amp;sdata=WgdK5dA3My%2BkuV5%2BbGqhP5QVZdEl4p0ae%2FB69YBV5YQ%3D&amp;reserved=0
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>>    --
>>>>    Carlos Rovira
>>>> 
>>>> 
>>> 
>> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&amp;data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728149855&amp;sdata=nyev5XLQQy49d3rbRH4EXN4z1KYu0hTC4eSCRUIutHQ%3D&amp;reserved=0
>>>> 
>>>> 
>>>> 
>>> 
>>>    --
>>>    Carlos Rovira
>>> 
>>> 
>> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&amp;data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728149855&amp;sdata=nyev5XLQQy49d3rbRH4EXN4z1KYu0hTC4eSCRUIutHQ%3D&amp;reserved=0
>>> 
>>> 
>>> 
>> 
>>    --
>>    Carlos Rovira
>> 
>> https://nam04.safelinks.protection.outlook.com/?url=http%3A%2F%2Fabout.me%2Fcarlosrovira&amp;data=02%7C01%7Caharui%40adobe.com%7C87fb43d241c445ea599f08d6fce102e7%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636974440728149855&amp;sdata=nyev5XLQQy49d3rbRH4EXN4z1KYu0hTC4eSCRUIutHQ%3D&amp;reserved=0
>> 
>> 
>> 
> 
> -- 
> Carlos Rovira
> http://about.me/carlosrovira

Reply via email to