Hi, I can't see the actual .tml, as either it was stripped by the mailer or you forgot to include it. But I guess compareDateRangeFrom component is in .tml after dateRangePresent component, and Tapestry not yet allocated a client ID for it. Generating client IDs is a bit complicated in Tapestry as a single Tapestry component can be rendered multiple times (e.g. in loops). There is "heartbeat" mechanism, that helps to solve such problems, e.g. see Tapestry's Label implementation. Try following approach:
@Import(library = "DateRangePreset.js") void afterRender() { renderLater(); } @HeartbeatDeferred private void renderLater() { JSONObject specs = new JSONObject(); specs.put("select", "#" + dateRangePresetSelect.getClientId()); specs.put("dateRangeFrom", "#" + dateRangeFrom.getClientId()); logger.info("ff: " + relatedRangeFrom); if (relatedRangeFrom != null) { logger.info("rel: " + relatedRangeFrom.getClientId()); // specs.put("relatedRangeFrom", "#" + relatedRangeFrom.getClientId()); specs.put("relatedRangeFrom", "#compareDateRangeFrom"); } } Best regards, Cezary On Mon, Jan 9, 2017 at 9:24 PM, Tony Nelson <tnel...@starpoint.com> wrote: > I’m trying to build a simple component that references up to 4 components > on my page. > > I’m using the component like this: > > > <t:dateRangePreset > t:dateRangeFrom="dateRangeFrom" > t:dateRangeTo="dateRangeTo" > t:relatedRangeTense="FUTURE" > t:relatedRangeFrom="compareDateRangeFrom" > t:relatedRangeTo="compareDateRangeTo" > t:disableDateRangePeriodTypes="DAILY" > t:disableDateRangeTense="FUTURE" /> > > > dateRangeFrom, dateRangeTo are both required in the component, and work > fine > > @Parameter(required = true, defaultPrefix = BindingConstants.COMPONENT) > private Field dateRangeFrom; > > @Parameter(required = true, defaultPrefix = BindingConstants.COMPONENT) > private Field dateRangeTo; > > relatedRangeFrom and relatedRangeTo are non-null, in after render, and > they are the right type, but the clientId always returns null > > @Parameter(required = false, defaultPrefix = > BindingConstants.COMPONENT) > private Field relatedRangeFrom; > > @Parameter(required = false, defaultPrefix = > BindingConstants.COMPONENT) > private Field relatedRangeTo; > > > afterRender() does the normal things > > @Import(library = "DateRangePreset.js") > void afterRender() { > > JSONObject specs = new JSONObject(); > specs.put("select", "#" + dateRangePresetSelect.getClientId()); > specs.put("dateRangeFrom", "#" + dateRangeFrom.getClientId()); > logger.info("ff: " + relatedRangeFrom); > > if (relatedRangeFrom != null) { > logger.info("rel: " + relatedRangeFrom.getClientId()); > // specs.put("relatedRangeFrom", "#" + > relatedRangeFrom.getClientId()); > specs.put("relatedRangeFrom", "#compareDateRangeFrom"); > } > > } > > In the log I see > > [INFO ][DateRangePreset] ff: org.apache.tapestry5.corelib. > components.DateField@46490fee > [INFO ][DateRangePreset] rel: null > > > The only thing that’s different between the required DateFields and the > optional ones, are that the required ones are before my component, the > optional ones are after my component, but that shouldn’t have anything to > do with. > > For completeness, here is more of my .tml file, what you see here are the > two required date fields, my new component, and then the two optional date > fields. > > Thanks in advance for any help. > Tony > > > > > ________________________________ > Since 1982, Starpoint Solutions has been a trusted source of human capital > and solutions. We are committed to our clients, employees, environment, > community and social concerns. We foster an inclusive culture based on > trust, respect, honesty and solid performance. Learn more about Starpoint > and our social responsibility at http://www.starpoint.com/ > social_responsibility > > ________________________________ > This email message from Starpoint Solutions LLC is for the sole use of the > intended recipient(s) and may contain confidential and privileged > information. Any unauthorized review, use, disclosure or distribution is > prohibited. If you are not the intended recipient, please contact the > sender by reply email and destroy all copies of the original message. > Opinions, conclusions and other information in this message that do not > relate to the official business of Starpoint Solutions shall be understood > as neither given nor endorsed by it. >