捕鼠器键绑定更新 $scope 但未被 $watch 检测到。

Mousetrap key bindings updating $scope but not detected by $watch.

基本上我已经创建了一个函数来更新范围变量

// controller.js

$scope.variable = 0;
$scope.$watch('variable', function(){
  console.log("change from watch");
});

$scope.increment = function(){
  $scope.variable++;
  console.log($scope.variable)
}

当我绑定一个键到这个函数时,

Mousetrap.bind('j', $scope.increment)

浏览器中的 console.log 显示变量在按下键时递增,在本例中为 "j",但从未调用上面的 $scope.$watch 函数并且console.log 消息 "change from watch" 未触发。

但是,当我在 html 文件上附加点击处理程序时,

// index.html
<a ng-click="increment()">{{ variable }}</a>

变量增加,console.log 显示 $scope.variable 增加,$watch 函数也被触发。

除了这个问题,{{ variable }}在我使用按键绑定时没有改变,但是当我点击它时它会改变。

我的猜测是 Mousetrap 中缺少某些导致函数触发但与 AngularJS $scope 不同步的东西?

请务必阅读 Databinding in AngularJS. Basically, in order for AngularJS to react to changes, something needs to trigger a $digest。内置的 ngClick 指令在后台执行此操作。

当使用非AngularJS的API时(例如Mousetrap),您需要手动将回调包装在$apply中,例如:

Mousetrap.bind('j', () => $scope.$apply($scope.increment));