Mithril.js: 如果视图使用子组件,则排序数据不会重新呈现

Mithril.js: sorting data not re-rendered if view uses subcomponent

我正在尝试对数据列表进行排序并反映更改,但如果我使用子组件来呈现内容,我的视图不会刷新。

我的排序函数仅通过按钮的 onclick 调用:

m('button', {onclick: ctrl.sort}, 'sort'),

这是一个复制我的问题的 jsfiddle。第一个版本使用子组件进行渲染。 https://jsfiddle.net/4trL6y22/

ctrl.names.map(function(name){
    return m(Hello, {who: name});
})

如果没有子组件重写代码,排序后视图刷新: https://jsfiddle.net/4trL6y22/1/

ctrl.names.map(function(name){
    return m('h1', name);
})

(我的真实案例更复杂,并且受益于子组件)。我缺少什么来将这种差异冒泡到页面上?

我不确定这是否是解决问题的最佳方法,但您可以将重绘策略设置为"all" m.redraw.strategy("all");

http://mithril.js.org/mithril.redraw.html#strategy

从代码片段来看,我认为您误解了控制器功能 运行。

Afaiu 控制器在创建组件时执行一次,但不会在后续差异中执行。 (一般来说,此声明的例外情况包括 key 更改时 (afaiu)。)

因此,将 options.who 直接放在视图中比将它设置在组件的控制器中更可取(它使它成为一个纯组件,因此我认为它更可取的原因 - 意味着状态保持在更少的places) 解决了其中一个问题。

另一个问题是 names 属性 在初始化时被设置为 list 道具的结果但从未更新(尽管,如果进行了上述更改然后正确的功能 出现 发生,因为 list 被更新,因为 sort() 执行和就地排序 - https://jsfiddle.net/bruce_one/1qpresbf/ vs https://jsfiddle.net/bruce_one/m3c5rn92/ 展示了我的意思试图解释)。因此,不是在控制器中调用 prop,而是在视图中检索值时调用它。

所以这两个更改(和一个 .slice(0) 使排序不可变(ish))变成:https://jsfiddle.net/bruce_one/4trL6y22/3/

(Afaict,这可以解决您的问题吗?)