返回一个事件处理函数,用指定 DOM 元素的值作为参数。
var state = {
    value: "",
    setValue: function(v) {state.value = v}
}
var Component = {
    view: function() {
        return m("input", {
            oninput: m.withAttr("value", state.setValue),
            value: state.value,
        })
    }
}
m.mount(document.body, Component)
        m.withAttr(attrName, callback, thisArg?)
        | 参数 | 类型 | 是否必须 | 描述 | 
|---|---|---|---|
attrName | 
                    String | 
                    是 | 属性名称,该属性的值会被传入回调函数 | 
callback | 
                    any -> undefined | 
                    是 | 回调 | 
thisArg | 
                    any | 
                    否 | 在回调函数中,绑定到 this 关键字上的对象 | 
                
| 返回 | Event -> undefined | 
                    事件处理函数 | 
m.withAttr 方法创建一个事件处理函数。该事件处理函数会调用一个函数,且以指定 DOM 元素的指定属性值作为参数。
这个辅助函数可以用于把浏览器的事件模型从应用代码中分离。
// 独立使用
document.body.onclick = m.withAttr("title", function(value) {
    console.log(value) // 点击时,输出 <body> 元素的标题
})
        通常,m.withAttr() 可以用在组件的视图中,避免 DOM 事件模型污染数据层:
var state = {
    email: "",
    setEmail: function(email) {
        state.email = email.toLowerCase()
    }
}
var MyComponent = {
    view: function() {
        return m("input", {
            oninput: m.withAttr("value", state.setEmail),
            value: state.email
        })
    }
}
m.mount(document.body, MyComponent)
        m.withAttr() 会读取事件处理函数绑定的元素的值,不需要和触发事件的元素相同。
var state = {
    url: "",
    setURL: function(url) {state.url = url}
}
var MyComponent = {
    view: function() {
        return m("a[href='/foo']", {onclick: m.withAttr("href", state.setURL)}, [
            m("span", state.url)
        ])
    }
}
m.mount(document.body, MyComponent)
        在上面的代码中,如果用户点击了链接中的文本,e.target 会指向 <span>,而不是 <a>
虽然这个行为是按照规范进行的,但很多时候并不使用。因此,m.withAttr 使用 e.currentTarget 的值,它会指向 <a>,通常会更适合。
m.withAttr() 的第一个参数是属性名(attribute 或 property 都可以)。
// 从 `select.selectedIndex` 属性中读取值
var state = {
    index: 0,
    setIndex: function(index) {state.index = index}
}
m("select", {onclick: m.withAttr("selectedIndex", state.setIndex)})
        如果参数名既是 attribute,也是 property,则会使用 property 的值。
// value 是布尔值,因为 `input.checked` 属性是布尔值
var state = {
    selected: false,
    setSelected: function(selected) {state.selected = selected}
}
m("input[type=checkbox]", {onclick: m.withAttr("checked", state.setSelected)})