当它们的值通过JavaScript变化时,我正在尝试重新初始化/重新绘制形式元素的所有MDC组件,但到目前为止,我的尝试已经跌落了。有没有一种简单的方法可以通过我不知道的内置MDC方法来实现这一目标?
我创建了一种自定义方法,以使用data-mdc-reload
HTML属性重新加载MDC组件,该属性在单击时触发,但这并不能力完成。
这是一个codepen,显示了问题:https://codepen.io/oneezy/pen/xvmavp
- 单击
UPDATE FORM VALUES
按钮添加数据 - 红色的
VALUE
输出表示组件破裂/蓝色表示它的工作 - 单击
RESET
按钮以将数据重置为初始状态(这也已损坏(
javascript
// MDC Reload Component
function mdcReload(time = 1) {
var components = mdc.autoInit();
let reloadComponents = document.querySelectorAll('[data-mdc-reload]');
for (const reloadItem of reloadComponents) {
reloadItem.addEventListener("click", async () => {
setTimeout(function() {
components.forEach((c) => c.layout && c.layout());
}, time);
});
}
}
// Initialize MDC Components
mdcReload();
您可以使用MDC提供的基础和适配器。我建议您制作每个组件的MDC实例,并使用mdc.COMPONENT.foundation_.adapter_
中的内置方法。
这是修改的笔
问题是您需要致电floatLabel(true)
以使标签设置其值后浮动。
if (c.foundation_.adapter_ && c.foundation_.adapter_.floatLabel) {
c.foundation_.adapter_.floatLabel(true);
}
此外,我将选择组件更改为
// $(MDCselect).val('Option 3');
// Instantiate the MDC select component.
const mdcSelect = mdc.select.MDCSelect.attachTo(document.querySelector('.mdc-select'));
mdcSelect.foundation_.adapter_.setValue('Option 3');
希望它有帮助!
我发现,通过JavaScript设置自定义值后,最简单的MDC组件标签的方法是将一个模糊事件发送给类似的输入:
yourMDCInput.dispatchEvent(new Event('blur'))
这将使MDC组件决定必须采取哪种操作,因此如果没有值集,则浮动标签,或重置标签。
这很烦人,但是如果没有挖掘MDC基金会的代码以找到更好的解决方案,我在文档中找不到任何更好的解决方案(无论如何,这些解决方案都不完整,部分错误(。
如果可以的话,请尝试使用MDC类实例设置您的值 - 在这种情况下,MDC组件将被告知更改,并将按预期行事。使用AutoInit时,请注意,文档说MDC类实例已将其附加到root <div>
,而实际上将其连接到了<label>
,其中设置了data-mdc-auto-init
属性。
假设您将mdctextfield包裹在<div id='my-text-field'>
中,则可以做类似:
document.querySelector('#my-text-field label').MDCTextField.value = 'hello world'
,该字段将按预期进行更新。