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ótulo

Eu 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?

questionAnswers(2)

yourAnswerToTheQuestion