Javascript 监视控制器';s属性,该属性来自角度

Javascript 监视控制器';s属性,该属性来自角度,javascript,angularjs,Javascript,Angularjs,我试图从链接函数中的关联指令中查看控制器的属性。控制器本身使用controllerAs设置为$scope上的“窗口”对象;以下是指令定义: function windowDirective() { return { transclude: true, template: template, restrict: 'E', controller: WindowCtrl, controllerAs: 'window', link: function(

我试图从链接函数中的关联指令中查看控制器的属性。控制器本身使用controllerAs设置为$scope上的“窗口”对象;以下是指令定义:

function windowDirective() {
  return {
    transclude: true,
    template: template,
    restrict: 'E',
    controller: WindowCtrl,
    controllerAs: 'window',
    link: function($scope, $element, $attrs, $ctrl) {
      $scope.$watch('window.x', function(newValue, oldValue) {
        // access x here
      });
    }
  };
}
这是WindowCtrl

'use strict';
class WindowCtrl {
  move(x, y) {
    this.x = x;
    this.y = y;
  }
}

module.exports = WindowCtrl;
当我拖动子指令时,
move(x,y)
正在被调用-它肯定正在被调用,
this.x
this.y
肯定正在WindowCtrl上设置。此外,如果我
console.dir
启动
$scope
几次
move()
,我可以在chrome中打开该作用域(因为它是惰性计算的),并看到
$scope.window.x
$scope.window.y
确实正在设置

但是,除了最初检测到
window.x
未定义外,my
$scope.$watch
从未实际触发。我真的不知道该怎么做。我确实搜索并尝试了我找到的所有解决方案,但似乎没有一个奏效

我用的是角度1.3.16

注意:只能从Angular的摘要周期内访问
WindowCtrl.move()
,请参见下文-但是使用
$scope.$apply()
可以解决此问题。我不知道为什么会这样。你能解释一下吗?下面是嵌套在上述指令内部的指令。它将调用
onDrag
中的方法,在我的示例中,该方法指向
window.move(x,y)


在$watch中,尝试使用如下函数观察程序:

$scope.$watch(function() {
  return $scope.window.x
 }, ...
自我回答:

看来,由于我的更新,我自己回答了这个问题,所以


$element.on
似乎并没有实际处于角度摘要周期中-这对我来说相当令人惊讶,我假设它会是。然而,这本质上意味着我的代码按它应该的方式工作——只是控制器上变量的变化不是很明显。解决此问题的方法是简单地使用
ng mousedown
等,或者在
$元素中使用
$scope.$apply
处理程序上。

我不确定将控制器视为变量是否与您尝试的方式完全相同。也许是参考资料:我读过,它确实像我写的那样工作。主要问题似乎是我的
$element.on(“…”)
似乎没有触发
$scope.$apply()
。不太奇怪,$element.on是一个jquery对象,不一定是一个角度对象。它也是一个jqlite对象;我的解决方案中没有jquery。我会假设jqlite在角度消化周期内
$scope.$watch(function() {
  return $scope.window.x
 }, ...