Mithril.js:如果视图使用子组件,排序数据不会重新渲染
Mithril.js: sorting data not re-rendered if view uses subcomponent
我正在尝试对数据列表进行排序并反映更改,但是如果我使用子组件来呈现内容,我的视图就不会刷新。
我的排序函数被调用简单的按钮的onclick:
m('button', {onclick: ctrl.sort}, 'sort'),
这是一个重复我的问题的文件。第一个版本使用子组件进行渲染。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);
})
(我的实际情况更复杂,并且从子组件中受益)。我还错过了什么,才把这种困难写进了书里?
从查看代码片段来看,我认为您误解了控制器函数的运行方式。
当然,控制器在创建组件时只执行一次,而不会在后续的差异中执行。(一般来说,该语句的例外情况包括key
发生变化(afaiu)。)
因此,将options.who
直接放在视图中比在组件的控制器中设置它更可取(它使其成为一个纯组件,因此为什么我认为它更可取—意味着在更少的地方维护状态),这解决了一个问题。
另一个问题是names
属性被设置为初始化时list
prop的结果,但从未更新过(尽管,如果进行上述更改,则正确的功能出现发生,因为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/
我不确定这是否是解决问题的最佳方法,但您可以将重绘策略设置为"all" m.redraw.strategy("all");
http://mithril.js.org/mithril.redraw.html策略
- 对角度数据表中括号内的数字进行排序
- 对损坏的子行进行排序的数据表
- 数据表排序但对行进行分组
- 角度未排序数据
- 数据表通过分析一列的值对其进行排序
- 排序数据表
- 对d3堆叠条形图的数据进行排序
- 如何对JQuery Handlebar生成的数据进行排序
- 数组数据排序类似mysql查询
- 使用JQuery对子表数据排序
- 数据排序应该在客户端还是服务器上完成
- a不同列列表的未定义或空引用的数据排序错误
- 日历数据排序 json 树
- 如何在ng-repeat中使用嵌套对象将数据排序为angular js中的JSON数据
- 使用knockout.js与json数据排序列表
- 如何突出显示页面上数据排序类型的菜单项
- dojox.grid.EnhancedGrid中的数据排序
- 在循环值时对JSON数据排序
- 帮助将DIV中的属性数据排序捕获为数组?Jquery/Javascript
- 如何从属性创建数组'数据排序'使用显示的所有分区的Jquery