Quando o shadowRoot está disponível para um componente de polímero?
Estou tendo problemas para entender quando o acesso ao shadowRoot de um componente está disponível. Aqui está uma imagem de um conjunto de componentes aninhados:
Portanto, existem alguns componentes:
MortgageDetails: Componente vinculando um grupo de 3 outros componentesMoneyInput - componente de entrada comMontante rótuloNumWithUnitsInput - componente de entrada comPrazo rótuloRateInput - componente de entrada comTaxa rótuloPaymentSchedule: componente com etiqueta correspondenteDateInput: componente comData de início rótuloEu instrumentei os métodos criados e anexados com a mensagem de log imprimindo o shadowRoot (sr => ...) e recebo o seguinte:
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)
O registro faz sentido. Os componentes são criados em uma ordem razoável e, em seguida, a conexão é iniciada. O problema é que os detalhes da hipoteca são anexados antes que o moneyInput contido seja anexado. Se eu adicionar mais uma instrução de log no diretórioMortgageDetails.attached Eu posso ver que seu objeto MoneyInput contido tem um shadowRoot:
mortgageDetails [FINE]: Composed moneyInput sr => Instance of 'ShadowRoot' (:1)
Este é um problema para a maneira como estou fazendo as coisas. Eu preciso de algum evento de inicialização no componente MoneyInput para acessar o shadowRoot e anexar alguns manipuladores. Não posso usarcriado porque shadowRoot ainda não está definido. Estou tentando usarem anexo. Eu tenho um código como esse atualmente noanexar de MoneyInput:
_amountElement = shadowRoot.querySelector('#money-amount')
..onBlur.listen((evt) => reformatAmount())
..onFocus.listen((evt) => reformatAmount())
..onKeyUp.listen((evt) { if(evt.which == 13) reformatAmount(); });
Como o MortgageDetails está sendo anexado e o MoneyInput ainda não foi anexado, uma instância do MortgageDetails não pode usar o MoneyInput contido como gostaria, pois não está totalmente inicializado. Por exemplo, em MortgageDetailsativar Eu tenho:
(mortgageAmountInput = $["mortgage-amount"] as MoneyInput)
..label = r" $ Amount of Loan"
..onBlur.listen((_) => recalc())
..onFocus.listen((_) => recalc());
Isso falha porque o MoneyInputativar não foi chamado. Acho que realmente preciso de um evento que diga que o shadowRoot foi definido, e nesse evento eu poderia fazer minha inicialização.
O que estou perdendo no ciclo de vida dos elementos poliméricos?