Javascript 在$scope上定义的对象变得未定义

Javascript 在$scope上定义的对象变得未定义,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,在我的指令控制器中,我有一块$watch,如下所示: $scope.$watch(function () { return service.abc; }, function(newVal, oldVal) { $scope.abc = {abc: newVal}; }); 我注意到,当在其他控制器中使用时,这个变量变得未定义,这使我遇到了问题。我设置了另一块手表: $scope.$watch('abc', function () { console.log($scope

在我的指令控制器中,我有一块$watch,如下所示:

$scope.$watch(function () {
    return service.abc;
}, function(newVal, oldVal) {
  $scope.abc = {abc: newVal};
});
我注意到,当在其他控制器中使用时,这个变量变得未定义,这使我遇到了问题。我设置了另一块手表:

 $scope.$watch('abc', function () {
     console.log($scope.abc);
 });
通过这个表,我看到abc对象被定义为服务的值,但是之后就没有定义了。我确信我不会在任何地方修改此对象。即使我设定

$scope.abc = {abc: angular.copy(newVal)}; 

为了确保对象不被修改,它仍然处于未定义状态。我尝试过使用vm-controllerAs语法并尝试不同的变量名以确保它没有被修改,但它仍然没有定义。发生什么事?我需要将这个对象传递到一个指令中,并且能够从父控制器修改它,并使内部指令控制器反映更改

首先,每次启动控制器或指令时,都需要初始化控制器或指令中的作用域变量

您似乎希望使用服务中设置的变量,这应该可以,因为它们是单例的,并且在应用程序的生命周期中,这些值将在页面之间保持不变

监视旨在监视控制器和指令中的作用域变量,因此当您使用:

$scope.$watch('abc', function () {
    console.log($scope.abc);
});
您正在查看控制器/指令中名为abc的范围变量。如果您在控制器/指令中没有初始化abc,那么这只手表将永远不会被解雇

此外,请确保使用此语法在控制器/指令中定义手表:

$scope.$on('$destroy', $scope.$watch('abc', function (newVal, oldVal) {
    if (newVal != oldVal) {
      // do something here
    }
}));
如果要进入页面、退出并重新进入页面,此定义可防止手表多次运行。手表定义了多次,但没有销毁