DOM 元素更改时 ng-model 变量不更新
ng-model variable not updating when DOM element changes
我正在使用 AngularJS 制作网站。
我在 jade 中声明变量为:
div {{event.latitude}} {{event.longitude}}
input#latitude(type='number' name='latitude' ng-model='event.latitude' required)
input#longitude(type='number' name='longitude' ng-model='event.longitude' required)
在同一页面上,我正在使用 Google 地图。我正在像这样更新 JavaScript 中的上述变量:
// adds a listener for when the user clicks the map
map.addListener('click', function(event){
// gets lat/long position from where the user clicked
var latitude = event.latLng.lat();
var longitude = event.latLng.lng();
var latlng = new google.maps.LatLng(latitude, longitude);
// sets the event marker to where the user clicked
eventLocation.setPosition(latlng);
console.log('Event Location:\n' , latitude, longitude);
document.getElementById('latitude').value = latitude;
document.getElementById('longitude').value = longitude;
});
此代码有效。当我单击地图时,纬度和经度会在表单输入框中更新。
但是,我 运行 遇到的问题是 ng-model 变量没有更新。如上所示,我通过插值显示 ng-model 变量。但是,当我手动单击输入框并自己更改值时,它们只会显示一个值。当 javascript 更改输入值时,它们不会更新。
谁能指出我做错了什么?
任何超出 angularJS 上下文的东西都不会影响 $scope,因此您无法在 ng-model 中获得价值。
但是如果你想这样做,你必须将你的代码包装在 Angularjs 的上下文中(最佳实践是创建一个自定义指令)
最后你必须打电话给
$scope.$digest()
。
通过 addListener
附加的事件侦听器不会自动为您触发 AngularJS' 摘要循环。
由于摘要周期未启动,因此不会执行任何观察程序,不会检测到任何更改,UI 也不会更新。
使用$apply
:
map.addListener('click', function(event) {
scope.$apply(function() {
scope.event.longitude = 100;
scope.event.latitude = 50;
});
});
我假设你的作用域上有一个 event
对象,因为你正在使用绑定 {{event.longitude}}
。
你不应该真的需要 document.getElementById('latitude').value = latitude;
除非你将它用于其他在这个例子中不明显的东西。
我正在使用 AngularJS 制作网站。
我在 jade 中声明变量为:
div {{event.latitude}} {{event.longitude}}
input#latitude(type='number' name='latitude' ng-model='event.latitude' required)
input#longitude(type='number' name='longitude' ng-model='event.longitude' required)
在同一页面上,我正在使用 Google 地图。我正在像这样更新 JavaScript 中的上述变量:
// adds a listener for when the user clicks the map
map.addListener('click', function(event){
// gets lat/long position from where the user clicked
var latitude = event.latLng.lat();
var longitude = event.latLng.lng();
var latlng = new google.maps.LatLng(latitude, longitude);
// sets the event marker to where the user clicked
eventLocation.setPosition(latlng);
console.log('Event Location:\n' , latitude, longitude);
document.getElementById('latitude').value = latitude;
document.getElementById('longitude').value = longitude;
});
此代码有效。当我单击地图时,纬度和经度会在表单输入框中更新。
但是,我 运行 遇到的问题是 ng-model 变量没有更新。如上所示,我通过插值显示 ng-model 变量。但是,当我手动单击输入框并自己更改值时,它们只会显示一个值。当 javascript 更改输入值时,它们不会更新。
谁能指出我做错了什么?
任何超出 angularJS 上下文的东西都不会影响 $scope,因此您无法在 ng-model 中获得价值。
但是如果你想这样做,你必须将你的代码包装在 Angularjs 的上下文中(最佳实践是创建一个自定义指令) 最后你必须打电话给
$scope.$digest()
。
通过 addListener
附加的事件侦听器不会自动为您触发 AngularJS' 摘要循环。
由于摘要周期未启动,因此不会执行任何观察程序,不会检测到任何更改,UI 也不会更新。
使用$apply
:
map.addListener('click', function(event) {
scope.$apply(function() {
scope.event.longitude = 100;
scope.event.latitude = 50;
});
});
我假设你的作用域上有一个 event
对象,因为你正在使用绑定 {{event.longitude}}
。
你不应该真的需要 document.getElementById('latitude').value = latitude;
除非你将它用于其他在这个例子中不明显的东西。