[REVIEW] Make controller instantiation customizable
Gaja Sutra
gajasutra at gmail.com
Mon Dec 19 08:36:22 PST 2011
>> Having<?param?> allow multiple arguments to this constructor of object represented by FXML.
> OK. How you might expect to use this feature in practice? I.e. what arguments might you want to pass to the FXML? How would you expect to pass them? How would you expect them to be used/accessed by the document and/or its associated logic? A simple use case with sample pseduo-code would be very helpful.
First example (because I have found a link to documentation), in case of
multiples forms, a typical usage can be passing an instance of a Java
object per form, like that (in XML world):
http://www.w3.org/TR/xforms/#concepts-multiple
In a simple and generic case like their poll near the form, I think the
poll will even be an included FXML file and the code inclusion will be
better with a specified parameter:
<fx:include source="poll.fxml">
<fx:with-param name="pollProcessor" value="${...}"/>
</fx:include>
// file "poll.fxml"
...<?import ...?>
<?param name="poll" type="PollProcessor"?>
<*Pane> <!-- no fx:controller="" -->
<Slider value="${poll.opinion}" />
<Button onAction="#poll.process"/>
</*Pane>
In this case, the parameter is probably strictly replacing the
controller of imported FXML, but I think code will be more readable
because link between FXML and the poll processor will be made in one and
only one method (the method called in //fx:with-param/@value). If we
have a fx:controller attribute, it will give the absolute class name,
but only the ControllerFactory will add, after creating instance, the
unique identifier of the form evaluated by the poll.
---
For me, when editing a document, I would expect uses like having
side-by-side near-independent views when user creates a new link, by
example when he creates an internal reference in a document:
* current text/data editing, where user is inserting a reference
* possibles targets for reference (items in table of contents or in
bibliographic table)
I would expect, by example, that possibles targets of reference will be
a parameter and using it like that:
<TableView items="${paramBibliographicEntries}" />
----
[My principles]: Most of my use-cases will be defined by extracting from
FXML controller instances of objects not using JavaFX objects. If a
method receive an *Event, it will go in FXML controller. When multiples
data fields of controller are correlated and used together (like the
model of a form), this becomes a class without references to JavaFX
classes; for manipulating the instance of the class, I prefer writing
declarative code (<?param?> in FXML) to imperative code (getter in FXML
controller in Java).
---
For passing parameters to FXMLLoader, I suggest allowing the two
possibilities: varargs (sufficient for me) and map (given many people
probably prefer named parameter).
NB: Varargs contains values of params following order of <?param name=""
type=""?> processing instructions ignoring pseudo-attribute name (then
used only in FXML files). Map, more precisely Map<String, Object>,
simply associate object to parameter using same name.
Hoping it can be useful.
Thanks,
More information about the openjfx-dev
mailing list