¿Cuándo ShadowRoot está disponible para un componente de polímero?
Tengo problemas para entender cuándo está disponible el acceso al shadowRoot de un componente. Aquí hay una imagen de un conjunto de componentes anidados:
Entonces hay un puñado de componentes:
Detalles de la hipoteca: componente que une un grupo de otros 3 componentesMoneyInput: componente de entrada conCantidad etiquetaNumWithUnitsInput: componente de entrada conTérmino etiquetaRateInput: componente de entrada conTarifa etiquetaCalendario de pago: componente con la etiqueta correspondienteDateInput: componente conFecha de inicio etiquetaHe instrumentado los métodos creados y adjuntos con un mensaje de registro que imprime shadowRoot (sr => ...) y obtengo lo siguiente:
mortgageDetails [FINE]: MortgageDetails created sr => null (:1)
moneyInput [FINE]: MoneyInput created sr => null (:1)
numWithUnitsInput [FINE]: NumWithUnitsInput created sr => null (:1)
rateInput [FINE]: RateInput created sr => null (:1)
paymentSchedule [FINE]: PaymentSchedule created sr => null (:1)
dateInput [FINE]: DateInput created sr => null (:1)
mortgageDetails [FINE]: MortgageDetails attached with sr => Instance of 'ShadowRoot' (:1)
El registro tiene sentido. Los componentes se crean en un orden razonable y luego comienza la conexión. Sin embargo, el problema es que los detalles de la hipoteca se adjuntan antes de que se adjunte su entrada de dinero contenida. Si agrego una declaración de registro más en elDetalles hipotecarios adjuntos Puedo ver que su objeto MoneyInput contenido tiene un shadowRoot:
mortgageDetails [FINE]: Composed moneyInput sr => Instance of 'ShadowRoot' (:1)
Este es un problema por la forma en que estoy haciendo las cosas. Necesito algún evento de inicialización en el componente MoneyInput para llegar a shadowRoot y adjuntar algunos controladores. No puedo usarcreado porque shadowRoot ni siquiera está configurado todavía. Estoy tratando de usaradjunto. Tengo un código como este actualmente en eladjuntar de MoneyInput:
_amountElement = shadowRoot.querySelector('#money-amount')
..onBlur.listen((evt) => reformatAmount())
..onFocus.listen((evt) => reformatAmount())
..onKeyUp.listen((evt) { if(evt.which == 13) reformatAmount(); });
Dado que MortgageDetails se está adjuntando y MoneyInput aún no se ha adjuntado, una instancia de MortgageDetails no puede usar el MoneyInput contenido como lo desea, ya que no está completamente inicializado. Por ejemplo, en MortgageDetailsactivar Yo tengo:
(mortgageAmountInput = $["mortgage-amount"] as MoneyInput)
..label = r" $ Amount of Loan"
..onBlur.listen((_) => recalc())
..onFocus.listen((_) => recalc());
Esto falla porque MoneyInput'sactivar No ha sido llamado. Creo que lo que realmente necesito es un evento que diga que se ha establecido shadowRoot, luego en ese evento podría hacer mi inicialización.
¿Qué me estoy perdiendo en el ciclo de vida de los elementos de polímero?