0

谁能解释一下,为什么当我单击元素vm.random内部更新的元素时,但是当我仅单击窗口 vm.random 时,视图层上没有更新(但console.log打印新值),尽管两个事件都会触发相同的功能vm.update()

<!DOCTYPE html>
<html>

<head>
  <script data-require="angular.js@1.5.9" data-semver="1.5.9" src="https://code.angularjs.org/1.5.8/angular.js"></script>
  <script>
    var app = angular.module('test', [])
      .directive('testDir', function() {
        return {
          controllerAs: 'vm',
          bindToController: true,
          controller: function() {
            var vm = this;
            vm.random = Math.random();

            window.onclick = function() {
              vm.update();
            };

            vm.update = function() {
              vm.random = Math.random();
              console.log(vm.random);
            };
          },
          template: '<div ng-click="vm.update()">Random number after click {{vm.random}}<input ng-model="vm.random"/></div>'
        }
      });
  </script>
</head>

<body ng-app="test">
  <h1>My directive</h1>
  <test-dir></test-dir>
</body>

</html>

为了在 window.onlick 更改 vm.random 之后能够更新 vm.random ,我应该在此代码段中进行哪些更改?

4

1 回答 1

4

尝试这个:

window.onclick = funciton(){
    $scope.$apply(function(){
        vm.update();
    });
}

记得将 $scope 注入你的控制器

即使vm.random不是直接在您的$scopeAngular 上,仍然需要知道它已经改变。$scope.$apply手动调用可以解决这个问题。

它使用的原因ng-click是,角度指令会自动$scope.$apply处理

于 2016-08-18T10:36:59.330 回答