Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.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 m.withAttr:将事件传递给另一个函数_Javascript_Mithril.js - Fatal编程技术网

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

Javascript Mithril.js m.withAttr:将事件传递给另一个函数,javascript,mithril.js,Javascript,Mithril.js,我正在浏览,在理解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”属性的值'。但是下半部分的目的是什么,选中:ta

我正在浏览,在理解
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”属性的值'。但是下半部分的目的是什么,选中:task.done()?看起来它只是在重复上半场

2) 在阅读本教程时,我想添加将TODO持久化到持久化层的功能。我创建了一个save函数,以便可以将上面引用的行重构为如下内容:

m(“输入[type=checkbox]”,{onclick:todo.vm.markAsDone.bind(todo.vm,task)})

在我的视图模型中,我具有以下功能:

vm.markAsDone = function(todo) {
      m.withAttr("checked", todo.done), checked: todo.done();
      todo.save();
    };
但这并没有起作用;我得到一个
未捕获的语法错误:意外标记:
错误。我认为问题在于事件没有正确绑定到
markAsDone
函数,因此它不理解
的“checked”
属性;但我不确定如何解决这个问题(如果这是问题的话)


谢谢您的帮助。

问题1

m()
函数的第二个参数定义HTML元素的属性,在这种情况下,
将被修饰。(特殊字段除外)

  • checked
    确定是否选中输入复选框,因此需要显示任务的状态
  • onclick
    是将修改状态的事件处理程序
因此属性做不同的事情,因此两者都是必需的

问题2

由于
markAsDone
传递了一个
todo
模型,因此您不必在那里执行任何
m.withAttr
调用。只需修改模型,然后让Mithril重新绘制视图。如果通过类似于
onclick
的事件调用
markAsDone
,则会自动进行重画

如果您想了解有关重画过程的更多信息,我将在一篇文章中对其进行总结

编辑:
markAsDone
可能如下所示:

vm.markAsDone = function(todo) {
    todo.done(true);
    todo.save();
};