Javascript 如何在Mithril小部件上向子级传播消息

Javascript 如何在Mithril小部件上向子级传播消息,javascript,mithril.js,Javascript,Mithril.js,我有一个mithrilListWidget,它显示项的列表。您在右侧看到的图标允许展开和折叠详细信息。它是每个项目vnode状态中的“展开”字段 现在,我想在展开子对象时折叠其余的子对象,以便只显示一个展开的子对象 因此,ListWidget在每个项的属性中添加了一个函数“requestCChildrenCollapse”。现在,当您单击一个子项展开按钮时,将调用该函数以在展开此子项之前折叠所有子项 我的问题是,我不知道如何从列表上下文访问列表项vnodesvnode.children为空vn

我有一个mithril
ListWidget
,它显示
项的列表。您在右侧看到的图标允许展开和折叠详细信息。它是每个项目
vnode
状态中的“展开”字段

现在,我想在展开子对象时折叠其余的子对象,以便只显示一个展开的子对象

因此,
ListWidget
在每个
项的属性中添加了一个函数“
requestCChildrenCollapse
”。现在,当您单击一个子项展开按钮时,将调用该函数以在展开此子项之前折叠所有子项

我的问题是,我不知道如何从
列表
上下文访问
列表项
vnodes
vnode.children
为空
vnode.instance.children
确实包含子项,但文档中说这是一个私有成员,不能使用。此外,他们是“整版”儿童

那么,实现这一目标的最佳实践是什么

ListWidget

ListWidget = () => {
     view: (vnode) => m(".fullpage", 
        [
            m("div.flexrow", [
                m(
                     "ul.listitems",
                     Object.keys(ListItem.get()).map(id => m(ListItem, {
                        id,
                        collapseChildrenRequest: () => {
                            for (const child of vnode.children) console.log(child);
                        }
                    }
                 )
            ])
        ]
     )
};
儿童点击:

onclick: () => {
vnodeView.attrs.collapseChildrenRequest();
vnodeView.state.isExpanded = !vnodeView.state.isExpanded;
},

是否已为每个DOM元素签入oninit()生命周期函数?您可以捕获当时生成的Vnode。您可以捕获生成的Vnode,也可以进一步将它们添加到事件列表器、添加键或id属性。可能不干净,但您甚至可以将Vnode捕获到您自己的数组中。现在我可以更好地理解mithril的工作原理了,请使用这些东西。谢谢