jsViews升级后,jQuery外部更新输入框无法同步关联对象问题
解决jsViews 1.0+中jQuery更新输入框后对象不同步的问题
我之前也碰到过类似的情况,升级jsViews到1.x版本后,旧的DOM操作同步数据的方式失效了,这是因为新版本对双向绑定的内部机制做了调整,不再完全依赖原生事件来触发模型同步。下面给你两种可行的解决办法:
原因说明
jsViews 1.0.7改变了双向绑定的事件监听逻辑,直接用val()修改输入框值再触发change(),已经无法自动同步到关联的obj对象了——旧版本的宽松处理在新版本里被收紧,更强调数据驱动的MVVM模式。
解决办法
方法1:直接更新数据模型(推荐)
既然用了jsViews的绑定,最好的方式是直接操作数据对象,让框架自动同步视图,完全不用手动碰DOM:
把按钮的点击事件代码改成这样:
$('#btn').click(function() { // 用jsViews的observable API更新对象,输入框会自动同步 $.observable(obj).setProperty("Title", "Hello"); });
这种方式既符合MVVM的设计思想,又能保证所有绑定了obj.Title的元素都能同步更新,不会出现数据和视图不一致的问题。
方法2:从DOM同步到模型(如果必须操作DOM)
如果你的业务场景确实需要先修改输入框的DOM值,再同步到对象,可以用jsViews提供的视图API来手动触发同步,比依赖原生事件更可靠:
$('#btn').click(function() { var $input = $('#title'); $input.val('Hello'); // 获取输入框对应的jsViews视图实例 var view = $input.data("view"); if (view) { // 手动触发从视图到模型的同步 view.updateModel(); } });
或者更简单一点,触发jsViews监听的input事件(注意不是原生的change):
$('#btn').click(function() { $('#title').val('Hello').trigger("input"); });
这两种方式都能适配新版本的jsViews机制,确保输入框的值同步到关联的obj对象里。
内容的提问来源于stack exchange,提问作者Rufi
相关产品推荐
相关产品推荐

