Mithril.js m.withAttr:将事件传递给另一个函数

时间:2015-06-29 06:48:59

标签: javascript mithril.js

我正在浏览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"属性;但我不确定如何解决这个问题(如果这就是问题)。

感谢您的帮助。

1 个答案:

答案 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();
};