从服务刷新特定控制器$ scope

时间:2014-03-05 15:53:40

标签: angularjs service controller scope local-storage

情况就是这样:当我点击某些按钮时,我有一个使用 LocalStorage 来保存一些对象的服务。

这些LocalStorage对象已连接到我的标头$ scope 。 问题是我只加载标题(及其$ scope),当我加载第一页然后它reamins被粘住,因为每次我更改页面时都不需要加载它。 但是,实际上,当我完成在LocalStorage中保存的东西时,我需要标题“重新加载”它的$ scope,因为在其中我有一个徽章,必须显示更新的LocalStorage元素长度(这是一个购物车徽章,到要清楚)。

那么,有没有办法从服务或其他控制器刷新特定的控制器$范围?也许有一些$ scope。$ apply()的事情? 或者有一种方法可以绑定Header控制器中的LocalStorage元素,以便在它发生更改时执行某些操作?

PS:不,我无法从标题中移出购物车徽章,是的,我真的必须使用LocalStorage(这是一个特定的请求)。

3 个答案:

答案 0 :(得分:2)

您需要在范围之间发送消息,因为角度范围使用prototype inheritance。简而言之,如果您的父作用域具有属性“foo”,并且您在子作用域中更新“foo”,则子作用域将获得“foo”的“新副本”。

要实现您的目标,可以使用$scope.$emit()通过范围层次结构发送事件更新,并$scope.$on()接收事件。像这样的东西。

function ParentController($scope, ...) {

     $scope.numberOfThings = 5;

     // Process 'updateThings' event 
     $scope.$on('updateThings', function(value) { 
         $scope.numberOfThings = value; 
     }); 
}

...

function ChildController($scope, ...) {

     $scope.someCallback = function() {

          // Send 'updateThings' up the scope chain. 
          $scope.$emit('updateThings', 47); 
     }
}  

如果您想以相反的方式执行此操作,可以将事件向下推送到范围链中,可以使用$scope.$broadcast()

答案 1 :(得分:0)

您可以在标头中使用$rootScope代替$scope,并且可以从其他控制器更新$rootScope值。

答案 2 :(得分:0)

'刷新'控制器通常使用$rootScope中的数据直接,但是使用$emit方法创建和发出自定义事件

您可以通过$rootScope发出自己的事件,然后将其传播到所有子范围,您可以在那里听取该事件

////// controller or service or directive

$rootScope.$emit('myOwnEvent', dataObj);

////// another controller

$scope.$on('myOwnEvent', function(newData) {
    $scope.data = newData; // or whatever
});