我正在浏览Mithril tutorial我无法理解 m.withAttr
。该指南在 View 层中有以下行:
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) 在学习本教程时,我想添加将待办事项保存到持久层的功能。我创建了一个保存函数,以便我可以将上面引用的行重构为:
m("input[type=checkbox]", { onclick: todo.vm.markAsDone.bind(todo.vm, task)})
在我的 View 模型中,我有以下功能:
vm.markAsDone = function(todo) {
m.withAttr("checked", todo.done), checked: todo.done();
todo.save();
};
但这并没有奏效;我收到 Uncaught SyntaxError: Unexpected token :
错误。我认为问题在于该事件没有正确绑定(bind)到 markAsDone
函数,因此它不理解 "checked"
属性;但我不确定如何解决这个问题(如果这就是问题的话)。
感谢您的帮助。
最佳答案
问题1
m()
的第二个参数函数定义 HTML 元素的属性,在本例中为 <input type=checkbox>
将被装饰。 (异常(exception)是特殊的 config 字段)
-
checked
确定输入复选框是否被选中,因此需要显示任务的状态。 -
onclick
是将修改状态的事件处理程序。
所以属性做不同的事情,因此两者都是需要的。
问题2
自 markAsDone
通过 todo
模型,您不必执行任何操作 m.withAttr
打电话到那里。只需修改模型,然后让 Mithril 重新绘制 View 即可。如果您调用markAsDone
,重绘会自动发生。通过像 onclick
这样的事件.
如果您想了解有关重绘过程的更多信息,我在previous SO question中进行了总结。 .
编辑:markAsDone
可能看起来像这样:
vm.markAsDone = function(todo) {
todo.done(true);
todo.save();
};
关于javascript - Mithril.js m.withAttr : Passing event to another function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31109401/