AngularJs监视窗口变量

Tro*_*sta 14 angularjs

在angularJs中可以观察全局变量吗?

我从遗留代码中设置了一个window.test变量,然后我需要观察该变量以了解它是否存在.

我尝试过类似的东西

$window.$watch("test" , function(n,o){
    //some code here...
}
Run Code Online (Sandbox Code Playgroud)

Kay*_*ave 22

有些.如果您包含Angular $window服务(如文档中所述,比window直接访问更安全),您可以:

app.controller('myCtrl', function ($scope,$window) {...}
Run Code Online (Sandbox Code Playgroud)

然后使用watch函数作为你$watch喜欢的第一个参数:

$scope.$watch(
    function () {
        return $window.test 
    }, function(n,o){
        console.log("changed ",n);
    }
);
Run Code Online (Sandbox Code Playgroud)

演示小提琴

但请注意,只有在$watch触发Angular执行$ digest之后才会执行.一种可能的方法是将遗留代码包装在遗留代码中,$scope.$apply或者$digest在遗留代码被激活后触发.这里有一些很好的文档.

基本上每当角度变化发生时(例如当jQuery导致变化时这是一个常见问题),就必须告诉Angular看看是否有变化.这是Angular保持合理性能的一种方式.

  • 另外需要注意的是,只有当$ window.test本身的值发生变化时才会触发 - 无论是原始类型(数字,字符串,日期,布尔值等)更改值,还是对象引用更改.如果你希望它在$ window.test的属性发生变化时触发,你需要传递`true`作为$ watch()的第3个参数,这样angular就会检查属性而不仅仅是相等. (6认同)
  • 如果在角度范围之外进行更改,这是否可行,例如在遗留代码中? (2认同)