$rootScope.$watch不使用Angularjs中的对象

$rootScope.$watch不使用Angularjs中的对象,angularjs,Angularjs,我有两个控制器。我在父控制器中定义了一个$rootScope变量,并根据单击的下拉列表对其进行更改 我希望更改反映在子控制器中 父控制器 $rootScope.variable = {'attr1':true, 'attr2':false, 'attr3':false}//initializing vm.clickedDropDown = function(index) { $rootScope.variable = {'attr1':false, 'attr2':false, 'att

我有两个控制器。我在父控制器中定义了一个$rootScope变量,并根据单击的下拉列表对其进行更改

我希望更改反映在子控制器中

父控制器

$rootScope.variable = {'attr1':true, 'attr2':false, 'attr3':false}//initializing
vm.clickedDropDown = function(index) {
    $rootScope.variable = {'attr1':false, 'attr2':false, 'attr3':false }
    switch (index) {
        case 1: 
            $rootScope.variable={'attr1':true, 'attr2':false, 'attr3':false}
            break;
        case 2: 
            $rootScope.variable={'attr1':false, 'attr2':true, 'attr3':false}
            break;
        case 3: 
            $rootScope.variable={'attr1':false, 'attr2':false, 'attr3':true}
            break;
    }
}
$rootScope.$watch($rootScope.variable,function(){
  console.log($rootScope.variable);
  console.log("changed");
},true)
子控制器

$rootScope.variable = {'attr1':true, 'attr2':false, 'attr3':false}//initializing
vm.clickedDropDown = function(index) {
    $rootScope.variable = {'attr1':false, 'attr2':false, 'attr3':false }
    switch (index) {
        case 1: 
            $rootScope.variable={'attr1':true, 'attr2':false, 'attr3':false}
            break;
        case 2: 
            $rootScope.variable={'attr1':false, 'attr2':true, 'attr3':false}
            break;
        case 3: 
            $rootScope.variable={'attr1':false, 'attr2':false, 'attr3':true}
            break;
    }
}
$rootScope.$watch($rootScope.variable,function(){
  console.log($rootScope.variable);
  console.log("changed");
},true)
变量正在变化,我可以将变量的变化视为输出。

您的手表错了

要么:

$rootScope.$watch('variable' ,function(){
  console.log($rootScope.variable);
  console.log("changed");
},true);

你的表错了

要么:

$rootScope.$watch('variable' ,function(){
  console.log($rootScope.variable);
  console.log("changed");
},true);


您可以简单地使用scope,因为子控制器将继承父控制器,并且可以访问scope和rootScope中定义的任何scope变量

HTML:


jsIDLE:

您可以简单地使用scope,因为子控制器将继承父控制器,并且可以访问scope和rootScope中定义的任何scope变量

HTML:


jsiddle:

我会在父控制器到子控制器之间使用
$broadcast
。这种方法并不昂贵,因为广播只发生一次。不管怎么说,在你的例子中,这不是一个好的做法。
$rootScope.watch('variable',…)
?抛出错误,因为变量是未定义的。我可以用$broadcast获得代码。当你观看$rootScope时,你不需要在watch属性中指定它,所以$rootScope。$watch('variable',function(newVal,oldVal,scope){//logix},true});如果这是一个函数,那么您需要在watcher中返回该函数。。。。根据经验法则,如果您不必观看,尽管您应该使用$broadcast,我会从父控制器到子控制器使用
$broadcast
。这种方法并不昂贵,因为广播只发生一次。不管怎么说,在你的例子中,这不是一个好的做法。
$rootScope.watch('variable',…)
?抛出错误,因为变量是未定义的。我可以用$broadcast获得代码。当你观看$rootScope时,你不需要在watch属性中指定它,所以$rootScope。$watch('variable',function(newVal,oldVal,scope){//logix},true});如果这是一个函数,那么您需要在watcher中返回该函数。。。。作为一个经验法则,如果你不必观看,尽管你应该使用$broadcast选项2。谢谢将在几分钟内标记出正确答案选项2已解决。谢谢将在几分钟内标记它的正确答案如原语类型的注意和范围的内在注意原语类型的注意和范围的内在