从AngularJS指令更新根范围

时间:2014-04-07 14:16:33

标签: javascript angularjs angularjs-directive angularjs-scope

我有一个指令,它会监视新旧值的输入框。我想在这里更新一下根镜的价值"总计" 。我试图使用所有,我知道像$ rootScope,广播消息,发出消息。这是代码。

app.directive('costCheck',function($compile,$rootScope,$timeout){
$rootScope.gName= "What did i buy?";
    return{
        restrict: 'A',
        link: function(scope,element,attrs){                    
            attrs.$observe('costCheck',function(value){ 

            });
            scope.$watch('cost',function(oldval,newval){alert(attrs.name);  
                alert(oldval+'--'+newval);
                var message = {type: 'channel', action: 'create', data: { name: "ssss", id: 0}};      
                $rootScope.$broadcast('get',message); 
            });     
        }
    }
});

这是我的主要控制器

app.controller('MainCtrl', function($scope,$rootScope) {
 $scope.totalCost = 'workinggg';
 $rootScope.$on('go', function() {alert();
        $scope.totalCost = 'working';
    });
});

如何更新rootcope。

2 个答案:

答案 0 :(得分:1)

我同意@haki的评论,你应该如图所示绑定控制器/指令的范围值。

scope : { value : '=value'}

但是如果你想要出于其他原因(即其他控制器)进行广播,那么将$ rootScope。$ on更改为$ scope。$ on。 $ scope是$ rootScope的子节点,广播将消息发送到子范围。

这是一个fiddle,显示了对指令范围的绑定。

编辑: fiddle更新以在指令

中设置$ rootScope上的totalCost

编辑2: fiddle从$ rootScope更新广播值,并在另一个控制器中处理

答案 1 :(得分:0)

有很多方法可以实现这一点,我不会这样做,但我只是想让你的代码在这里工作。

  • 我想您不想更新根范围(如标题所示),但您希望通过根范围进行通信。
  • 正如@Shomz所说,你需要匹配事件名称。
  • 如果你使用$ rootScope,你可以发出事件而不是做广播,然后就不必在你的应用程序中冒泡了

指令代码:

$rootScope.$emit('totalCostUpdated',message); 

主控制器:

app.controller('MainCtrl', function($scope,$rootScope) {
   $scope.totalCost = 'workinggg';
   $rootScope.$on('totalCostUpdated', function(event, args) {
       $scope.totalCost = 'working';
   });
});
但是,我可能会使用共享服务。看看https://egghead.io/lessons/angularjs-sharing-data-between-controllers