在angularjs应用开发中,常见需求之一是从一个独立打开的弹出窗口(例如,用于选择地图坐标、文件等)向父窗口传递数据,并更新父窗口中由ng-model绑定的表单元素。开发者通常会尝试通过以下步骤实现:
然而,实践中会发现,尽管输入框的显示值可能已经改变,但其背后的ng-model绑定的数据模型却没有同步更新。这是因为AngularJS的ngModelController默认监听特定的DOM事件(如input、change、blur等)来感知视图的变化并更新模型。当通过JavaScript直接修改元素的value属性时,这些DOM事件并不会自动触发。
要解决ng-model不同步的问题,关键在于在程序化更新DOM元素的值之后,显式地触发一个input事件。这会模拟用户在输入框中键入内容的行为,从而激活ngModelController的监听机制,使其重新评估输入框的值并更新绑定的模型。
以下是实现这一功能的JavaScript代码示例:
function SetLatLng() { // 检查父窗口是否存在且未关闭 if (!window.opener || window.opener.closed) { return; } // 获取父窗口中对应的经纬度输入框元素 var txtLat = window.opener.document.getElementById(latId); var txtLng = window.opener.document.getElementById(lngId); // 获取弹出窗口中选择的经纬度值 var lat = document.getElementById('latitude').value; var lng = document.getElementById('longitude').value; // 更新纬度输入框的ng-model if (txtLat) { // 1. 在AngularJS的scope上下文中执行操作 window.opener.angular.element(txtLat).scope().$apply(function () { // 2. 通过ngModelController.$setViewValue更新ng-model的视图值 // 这会更新ng-model的内部状态,但可能不会立即触发DOM到模型的同步 window.opener.angular.element(txtLat).controller('ngModel').$setViewValue(lat); }); // 3. 关键步骤:手动触发'input'事件,通知AngularJS DOM值已改变 txtLat.dispatchEvent(new Event('input')); } // 更新经度输入框的ng-model if (txtLng) { window.opener.angular.element(txtLng).scope().$apply(function () { window.opener.angular.element(txtLng).controller('ngModel').$setViewValue(lng); }); txtLng.dispatchEvent(new Event('input')); } // 关闭当前弹出窗口 window.close(); }
在AngularJS中从弹出窗口更新父窗口的ng-model,仅仅使用$setViewValue和$apply是不够的。关键在于理解ngModelController的工作原理:它依赖于DOM事件来感知视图变化。因此,在程序化地设置ng-model的视图值并调用$apply之后,务必通过dispatchEvent(new Event('input'))手动触发一个input事件,以确保AngularJS能够正确地捕获到这一变化并同步更新其内部数据模型。这一方法提供了一种健壮且可靠的跨窗口数据同步方案。
以上就是AngularJS跨窗口ng-model更新:事件触发机制解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号