Javascript 在$scope上定义的对象变得未定义
在我的指令控制器中,我有一块$watch,如下所示: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
$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
}
}));
如果要进入页面、退出并重新进入页面,此定义可防止手表多次运行。手表定义了多次,但没有销毁