我一直在研究许多双向数据绑定库,但到目前为止还没有找到一个会在模型的更改中设置输入值时触发 onchange 事件的库。有没有办法用 ractive.js 做到这一点?
2 回答
这是可能的,但有点hacky。浏览器仅在change
用户交互(而不是input.value = 'someNewValue'
)时触发事件,因此您必须自己观察模型并触发事件:
var ractive = new Ractive({
el: 'main',
template: '#template',
data: { name: 'world' },
twoway: false
});
ractive.observe( 'name', function () {
// name has changed, need to simulate an event
var event = new Event( 'change' );
ractive.find( 'input' ).dispatchEvent( event );
});
ractive.find( 'input' ).addEventListener( 'change', function ( event ) {
console.log( 'event was fired', event );
});
// check the console!
ractive.set( 'name', 'everybody' );
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<main></main>
<script id='template' type='text/ractive'>
<h1>Hello {{name}}!</h1>
<input value='{{name}}'/>
</script>
请注意,双向绑定已被禁用,否则当用户确实与输入交互时,您会在整个地方触发额外的事件- 因此您需要侦听input
/change
事件并自己处理这些交互。
答案(出于我的目的)实际上非常简单。首先是一点背景 - 我可能应该在原始问题中概述。假设您正在查看/编辑客户资料。与此同时,其他人也在做同样的事情。他们更新电话号码并重新保存个人资料。如果没有做任何特别的事情,除非您重新加载配置文件,否则您不会看到新手机#。我的目标是让我们的数据/表单“具有反应性”。其中一个困难是更新表格。这本身很容易,但如何处理输入上的任何 onchange 事件。假设一个国家发生了变化,因此需要出现一个新的地区列表。我更改国家/地区将触发该国家/地区的 onchange 事件,并且会出现一个新列表。如果发生反应性更改并更新国家/地区,onchange 将不会 不开火。那是个问题。长话短说,答案是在输入上没有任何 onchange 事件,但有一个 Ractive.on('change') 事件,然后解析任何感兴趣的关键路径。这将通过设置或合并来捕捉来自人类的变化和来自“超越”的变化。
var cust = {
firstname: 'Fred',
lastname: 'Flintstone'
}
ractive = new Ractive({
el: '#spot',
template: '#tmpl1',
data: {customer: cust},
lazy: true
})
ractive.on('change', function(kp) {
console.log(kp)
})
setTimeout(function() {
ractive.set('customer.firstname', 'Wilma')
}, 2000)
setTimeout(function() {
ractive.merge('customer', {firstname: 'Barney', lastname: 'Rubble'})
}, 4000)
<script src="http://cdn.ractivejs.org/latest/ractive.js"></script>
<body>
<div id='spot'></div>
<script id='tmpl1' type='text/tmpl'>
<input value={{customer.firstname}}>
<input value={{customer.lastname}}>
</script>
</body>