More than one template model can be implemented at a time for a given class. For instance, a class could have the following signature:
public class MyModel implements TemplateHashModel, TemplateMethodModel, TemplateListModel2 { // Implementation goes here... }
When presented with a class such as the above, FM-Classic will attempt
to "do the right thing". Supposing such a class was placed inside
a TemplateModelRoot
implementation, under the key name of
demo
. A FM-Classic template could perform all of the
following:
<comment> The following will index element one of the TemplateListModel implementation... </comment> The second element of the list is: ${demo[ 1 ]} <comment> The following will reference the key name "hello" of the TemplateHashModel implementation... </comment> Say hello: ${demo.hello} And again: ${demo[ "hello" ]} <comment> The following will call the "demo" method (the TemplateMethodModel implementation)... </comment> Call from the demo() method... ${demo()}
Special care needs to be takes when implementing
TemplateListModel
and TemplateHashModel
within the
same class. In practise, this means avoiding having numeric keys inside a
TemplateHashModel
.
If you use dot notation (eg. foo.bar
) to reference keys inside
your model, FM-Classic will always treat the key as being a
TemplateHashModel
.
If you use dynamic key notation (eg. foo[ bar ]
), FM-Classic
will first check whether the key can be evaluated as a numeric value, such
as a TemplateNumberModel
. If it can, it will use the
TemplateListModel
or TemplateListModel2
implementation. If the key can only be evaluated as a String
value,
it will then fall-back on looking up the key using the
TemplateHashModel
.
Previous: Object Model | Next: Simple Models |