手动AngularJS更新输入不会触发模型中的更改

rel*_*uxa 18 angularjs

当我从普通JavaScript更改输入元素的值时,角度模型不会更新.是否有任何方法通过在更改后手动触发某些事件来以某种方式触发此更新?

<body ng-controller="MainCtrl">
  <script>
    function changeValue() {
      var e = document.getElementById("field");
      e.value = "updated value";
    }
  </script>

  field: <input type="text" id="field" ng-model="field">{{field}}
  <br>
  <button onclick="changeValue()">Change the value</button>

</body>
Run Code Online (Sandbox Code Playgroud)

完整的例子可以在plunkr找到.单击按钮后,我希望{{field}}以某种方式更新.有没有办法做到这一点?

Fre*_*all 41

你不应该这样做(除非它的测试,但即使这样,请考虑量角器).以这种方式与角度交互是一个坏主意.但是,如果你必须,这就是你如何做到的.

function changeValue() {
  var e = document.getElementById("field");
  e.value = "updated value";
  var $e = angular.element(e);
  $e.triggerHandler('input');
}
Run Code Online (Sandbox Code Playgroud)

PLNKR


一种不同的中间方式

function changeValue() {
  var e = document.getElementById("field");
  var scope = angular.element(e).scope();
  scope.field = "updated value";
  scope.$digest();
}
Run Code Online (Sandbox Code Playgroud)

PLNKR


正确的方法是使用角度控制器

  $scope.changeValue = function(){
    $scope.field = "updated value";
  }; 
Run Code Online (Sandbox Code Playgroud)

PLNKR

  • 当然,我打算在单元测试中使用它,而不是在生产代码中. (7认同)