I don’t think you could use interfaces in that case. Also, some formatters have options such as separator and such. I guess the options could be static, but that would preclude having more than one setting in a single app.
> On Jan 18, 2019, at 11:33 AM, Carlos Rovira <carlosrov...@apache.org> wrote: > > Hi, > just one thing to add to the discussion. Maybe could be good to implement > as static so we don't need an instance per component? > So using "SomeFormatterClass.format(date)" could be possible? > > El vie., 18 ene. 2019 a las 4:38, Alex Harui (<aha...@adobe.com.invalid>) > escribió: > >> You can override in MXML if the code checks before loading from >> ValuesManager. >> >> What strands can it go on and why? >> >> -Alex >> >> On 1/17/19, 2:16 PM, "Harbs" <harbs.li...@gmail.com> wrote: >> >> Interesting. I never considered that. Although there’s then no way to >> override in MXML. >> >> >> I think keeping it a bead leaves the most flexibility. >> >> I don’t know of any pain points in Flex. >> >>> On Jan 17, 2019, at 11:47 PM, Alex Harui <aha...@adobe.com.INVALID> >> wrote: >>> >>> IIRC, it doesn't have to be a bead to be specified in CSS. You just >> have to define the property. Then ValuesManager will return the Class and >> you instantiate. Where you store it after that doesn't matter. It doesn't >> have to be a strand. >>> >>> It really comes down to how folks should want to work with >> Formatters. Were there any pain points in Flex? >>> >>> HTH, >>> -Alex >>> >>> On 1/17/19, 1:40 PM, "Harbs" <harbs.li...@gmail.com <mailto: >> harbs.li...@gmail.com>> wrote: >>> >>> OK, true. >>> >>> To me the main advantage of it being a bead is the ability to >> specify the default in CSS. The idea behind specifying the bead was to >> specifically reference it (or override it). Using the bead specified in CSS >> is difficult if not impossible in MXML. >>> >>>> On Jan 17, 2019, at 10:50 PM, Alex Harui <aha...@adobe.com.INVALID> >> wrote: >>>> >>>> Not sure I see any advantage of it being a bead there. What >> reference to the strand or application does it need? Once you give >> anything an id it is "globally" available. >>>> >>>> <fx:Declarations> >>>> <foo:FooFormatter id=“fooFormat”/> >>>> </fx:Declarations> >>>> >>>> <foo:FooComponent> >>>> <foo:BazComponent text=“{fooFormat.format(date)}”/> >>>> </foo:FooComponent> >>>> <foo:SomeOtherFooComponent> >>>> <foo:SomeOtherBazComponent text=“{fooFormat.format(date)}”/> >>>> </foo:SomeOtherFooComponent> >>>> >>>> My 2 cents, >>>> -Alex >>>> >>>> On 1/17/19, 12:09 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>>> >>>> I’d keep it a bead, so you could do something like this (I think): >>>> <foo:FooComponent> >>>> <js:beads> >>>> <foo:FooFormatter id=“fooFormat”/> >>>> </js:beads> >>>> <foo:BazComponent text=“{fooFormat.format(date)}”/> >>>> </foo:FooComponent> >>>> >>>>> On Jan 17, 2019, at 9:43 PM, Alex Harui <aha...@adobe.com.INVALID> >> wrote: >>>>> >>>>> >>>>> >>>>> On 1/17/19, 11:30 AM, "Harbs" <harbs.li...@gmail.com <mailto: >> harbs.li...@gmail.com>> wrote: >>>>> >>>>> Currently, the view must know about the formatter AND the >> formatter must know about the view. >>>>> >>>>> I’m proposing that the view knows there is an IFormatter and just >> calls a format() function which is common to all formatters. >>>>> >>>>> Changing it to the way I’m proposing would also allow for >> something like this: text = new FooFormatter.format(baz); >>>>> >>>>> I think it’s reasonable for a view to know it’s using some >> formatter. >>>>> >>>>> Yeah, I think it is reasonable too. However, calling "new >> FooFormatter.format(baz)" is not going to work well with >> Formatters-as-beads. And instantiating a formatter each time is probably >> also going to be painful for Garbage Collection and if the formatter needs >> to have other properties set (potentially from locale information). >>>>> >>>>> That's why I recommend thinking this through. We need to agree on >> how folks will want to use and maybe share formatters and how to do so from >> MXML, which is more property-oriented than function-oriented. >>>>> >>>>> One issue is that DateField wants to instantiate its own >> DateFormatter but then that can't be easily shared as the DateFormatter in >> a user's app. >>>>> >>>>> HTH, >>>>> -Alex >>>>> >>>>>> On Jan 17, 2019, at 9:10 PM, Alex Harui <aha...@adobe.com.INVALID> >> wrote: >>>>>> >>>>>> I don't like the way it is now. That sounds more like a >> validator workflow. Having DateFormatter require IDateChooserModel doesn't >> sound right. I think the goal of the current implementation was to not >> require the views to know about the formatter. Then you could change what >> the view would display by using a different formatting bead. Maybe that >> was a bad idea. I think you are proposing that the views know they are >> using a formatter. >>>>>> >>>>>> Let's think about how we want Formatters to be used. The first >> question that comes to mind is whether the common case is that a single >> formatting "algorithm" would be used throughout an application. If so, >> then scattering formatting beads on strands in different places in the >> application will be painful to manage unless you have a central config to >> manage them. >>>>>> >>>>>> IOW, I think it would be rare for dates or currency to be >> formatted in one way in some component and differently in some other >> component. >>>>>> >>>>>> The second thing to consider is loose-coupling. How will the >> View find a formatter? The advantage of beads is that formatters can be >> replaced, but only if the view finds the formatter by interface name. But >> then they might be able to find the formatter some other way anyway. >> Related: should the presence of a formatter be optional? I think not in >> the common case. The view shouldn't have to worry about the formatter not >> being there when expected. A view either needs a formatter or it doesn’t. >>>>>> >>>>>> Next question: How should views be able to use formatters when >> written in MXML? If there is a shared formatter, that implies function >> call binding which is sort of heavy. Having a bead for each property being >> formatted allows the binding system to use SimpleBinding which is >> cheaper/faster. But I think it might be too painful to have a formatter >> instance for each formatted property. >>>>>> >>>>>> So, maybe it is better to have Views expect formatters. But >> maybe formatters should be Singletons so they are shared. >>>>>> >>>>>> Thoughts? >>>>>> -Alex >>>>>> >>>>>> On 1/17/19, 9:36 AM, "Andrew Wetmore" <cottag...@gmail.com >> <mailto:cottag...@gmail.com> <mailto:cottag...@gmail.com <mailto: >> cottag...@gmail.com>>> wrote: >>>>>> >>>>>> This simplification sounds good. Will you be annotating how to >> use the new >>>>>> bead structures, maybe with some examples, for those of us who >> are lost >>>>>> among the strands? >>>>>> >>>>>> On Thu, Jan 17, 2019 at 12:26 PM Harbs <harbs.li...@gmail.com >> <mailto:harbs.li...@gmail.com>> wrote: >>>>>> >>>>>>> I have the occasion this week to deal with the formatter >> classes, and I’d >>>>>>> like to make some changes. I’d like input from others on the >> subject. >>>>>>> >>>>>>> Taking SimpleDateFormatter as an example: >>>>>>> 1. The Formatter assumes that its being attached to a Strand >> with an >>>>>>> IDateChooserModel. >>>>>>> 2. It requires a “propertyName to be set and concatenates that >> with >>>>>>> “Changed” and adds an event listener to the model. >>>>>>> 3. When the property is changed, it formats the result which >> must be a >>>>>>> “selectedDate” and then dispatches an event. >>>>>>> 4. The view bead must attach an event listener to the Formatter >> to get >>>>>>> notification when the format changes. >>>>>>> 5. It also invariably attaches an event listener to the model >> when the >>>>>>> model changes. >>>>>>> 6. When the model changes we have first an event picked up by the >>>>>>> formatter and then the formatter dispatches a separate event >> which is >>>>>>> picked up by the view. The view then explicitly gets the >> formatted date >>>>>>> from the formatter. >>>>>>> >>>>>>> That’s a lot of indirection for no apparent reason. It also >> limits how a >>>>>>> formatter can be used. A DateFormatter can only be used in >> conjunction with >>>>>>> a IDateChooserModel and it can only format a “selectedDate”. I >> ran into >>>>>>> issues when trying to figure out how to use the formatters with >> date ranges. >>>>>>> >>>>>>> I want to change it to the following: >>>>>>> >>>>>>> 1. Make the formatter classes very simple Beads. >>>>>>> 2. It will make no assumptions on there being any other beads >> and will not >>>>>>> attach any event listeners. >>>>>>> 3. Likewise, it will not dispatch any events. >>>>>>> 4. Date Formatter classes would have a format(date:Date):String >> method >>>>>>> which would take any valid date and return the formatted string. >>>>>>> 5. When a view needs to update a formatted date, it would simply >> get the >>>>>>> format bead and call format(). This would allow the bead to be >> instantiated >>>>>>> by any class and would greatly simplify the code. >>>>>>> >>>>>>> I’d make similar changes to the other formatter classes. >>>>>>> >>>>>>> Any objections to these changes? >>>>>>> >>>>>>> Harbs >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Andrew Wetmore >>>>>> >>>>>> >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0 >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0> >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0 >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0>> >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0 >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0> >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0 >> < >> https://na01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fcottage14.blogspot.com%2F&data=02%7C01%7Caharui%40adobe.com%7Cf94019751d934c60bb2d08d67cc9643e%7Cfa7b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636833601775326776&sdata=2F%2BRWlR1o%2Bh7piIABUOwKWRaL4VhuFWYYwgHrkq994c%3D&reserved=0 >>>>> >> >> >> >> > > -- > Carlos Rovira > http://about.me/carlosrovira