我无法理解何时可以访问组件的shadowRoot。这是一组嵌套组件的图像:
因此,有一些组件:
我已经用打印出shadowRoot(sr => ...)的日志消息对创建和附加的方法进行了检测,然后得到以下结果:
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)
日志记录很有意义。组件以合理的顺序创建,然后开始连接。问题是,抵押详细信息在其包含的moneyInput被附加之前被附加。如果在MortgageDetails.attached中再添加一条日志语句,则可以看到其包含的MoneyInput对象具有shadowRoot:
mortgageDetails [FINE]: Composed moneyInput sr => Instance of 'ShadowRoot' (:1)
这是我做事方式的问题。我需要在MoneyInput组件中进行一些初始化事件,以进入shadowRoot并附加一些处理程序。我不能使用created,因为shadowRoot尚未设置。我正在尝试使用attach。我现在在MoneyInput的附件中有这样的代码:
_amountElement = shadowRoot.querySelector('#money-amount')
..onBlur.listen((evt) => reformatAmount())
..onFocus.listen((evt) => reformatAmount())
..onKeyUp.listen((evt) { if(evt.which == 13) reformatAmount(); });
由于已附加MortgageDetails而尚未附加MoneyInput,因此MortgageDetails实例无法使用所包含的MoneyInput,因为它尚未完全初始化。例如,在MortgageDetails激活中,我有:
(mortgageAmountInput = $["mortgage-amount"] as MoneyInput)
..label = r" $ Amount of Loan"
..onBlur.listen((_) => recalc())
..onFocus.listen((_) => recalc());
由于未调用MoneyInput的激活,因此失败。我认为我真正需要的是一个已设置shadowRoot的事件,然后可以对该事件进行初始化。
在聚合物元素的生命周期中我缺少什么?
通常情况下,如果你扩展PolymerElement
的主要回调的订货会ready
,created
,attached
。这些是自上而下发生的:它们在后代之前先于祖先被调用。首先ready
调用它可能会造成混淆,但这是因为PolymerElement.created
在设置DOM甚至处理程序之后调用它,并且是因为在类created
构造函数之前发生了构造函数排序。
Polymer还添加了一个domReady
可以重写的方法,当确保已创建元素的子元素时将调用该方法。那可能就是您所需要的。
有关生命周期方法的详细信息,请参见http://www.polymer-project.org/docs/polymer/polymer.html#lifecycle方法。
首先,我将看看是否可以通过数据绑定和声明性事件来避免排序问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句