Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mithril.js:如果视图使用子组件,则不会重新呈现排序数据_Javascript_Mithril.js - Fatal编程技术网

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

Javascript Mithril.js:如果视图使用子组件,则不会重新呈现排序数据,javascript,mithril.js,Javascript,Mithril.js,我试图对数据列表进行排序并反映更改,但如果使用子组件呈现内容,则视图不会刷新 我的排序函数仅通过按钮的onclick调用: m('button', {onclick: ctrl.sort}, 'sort'), 这里有一个JSFIDLE复制了我的问题。第一个版本使用子组件进行渲染。 如果在没有子组件的情况下重写代码,则排序发生后视图将刷新: (我现实生活中的案例更为复杂,并且受益于拥有子组件)。我不确定这是否是解决问题的最佳方法,但您可以将重绘策略设置为“全部”m.redraw.strate

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

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

m('button', {onclick: ctrl.sort}, 'sort'),
这里有一个JSFIDLE复制了我的问题。第一个版本使用子组件进行渲染。

如果在没有子组件的情况下重写代码,则排序发生后视图将刷新:


(我现实生活中的案例更为复杂,并且受益于拥有子组件)。我不确定这是否是解决问题的最佳方法,但您可以将重绘策略设置为“全部”
m.redraw.strategy(“全部”)


通过查看代码片段,我认为您误解了控制器功能的运行方式

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

因此,直接在视图中放置
options.who
比在组件的控制器中设置它更可取(这使它成为一个纯组件,因此我认为它更可取——这意味着状态在较少的位置维护),这解决了一个问题

另一个问题是,
names
属性在初始化时设置为
list
属性的结果,但从未更新(尽管如此,如果进行了上述更改,则由于
list
由于
sort()而更新,因此出现了正确的功能
执行并就地排序(vs演示了我要解释的内容)。因此,与其在控制器中调用prop,不如在视图中检索值时调用它

因此,这两个更改(以及一个
.slice(0)
以获得排序非变异(ish))变为:


(Afaict,这是在解决您的问题吗?

谢谢,将子组件转换为纯组件成功了。不过,我仍在努力理解机械原理。你介意给我指一些关于控制器函数如何以及何时运行的文档吗。。。事实上,我不知道有什么可以指给你们看(我只是意识到,控制器并不是每次都在类似的“为什么这不做我认为应该做的事情”之后被调用)。相关代码是:如果有帮助的话-sHmm,我能找到的最好的方法是在渲染组件时调用一次控制器函数。随后,调用view函数,并在需要重画时再次调用该函数。控制器函数的返回值作为其第一个参数传递给视图。
from--和常规控制器讨论。
ctrl.names.map(function(name){
    return m(Hello, {who: name});
})
ctrl.names.map(function(name){
    return m('h1', name);
})