我正在浏览Mithril tutorial并且无法理解m.withAttr
。该指南在视图层中具有以下行:
m("input[type=checkbox]", {onclick: m.withAttr("checked", task.done), checked: task.done()})
我有两个问题。
1)我理解上半部分onclick: m.withAttr("checked", task.done)
的意思是:
'使用m.prop将task.done设置为“checked”属性的值。但下半场的目的是什么,checked: task.done()
?看起来它只是在重复上半场。
2)当我完成本教程时,我想添加将我的Todos持久化到持久层的功能。我创建了一个保存函数,这样我就可以将上面引用的行重构为:
m("input[type=checkbox]", { onclick: todo.vm.markAsDone.bind(todo.vm, task)})
在我的视图模型中,我有以下功能:
vm.markAsDone = function(todo) {
m.withAttr("checked", todo.done), checked: todo.done();
todo.save();
};
但这不起作用;我收到Uncaught SyntaxError: Unexpected token :
错误。我认为问题是事件未正确绑定到markAsDone
函数,因此它不理解"checked"
属性;但我不确定如何解决这个问题(如果这就是问题)。
感谢您的帮助。
答案 0 :(得分:1)
问题1
m()
函数的第二个参数定义HTML元素的属性,在这种情况下,<input type=checkbox>
将被装饰。 (例外是特殊的 config 字段)
checked
确定是否选中了输入复选框,因此需要显示任务的状态。 onclick
是修改状态的事件处理程序。所以属性做了不同的事情,因此需要它们。
问题2
由于markAsDone
传递了todo
模型,因此您不必在那里进行任何m.withAttr
调用。只需修改模型,让Mithril重绘视图。如果您通过markAsDone
等事件致电onclick
,则会自动重绘。
如果您想了解有关重绘过程的更多信息,请将其汇总到previous SO question。
编辑:markAsDone
可能如下所示:
vm.markAsDone = function(todo) {
todo.done(true);
todo.save();
};