通过调用$ rootScope中定义的方法从$ rootScope访问$ scope?

时间:2014-10-30 16:45:03

标签: javascript angularjs

我在$ rootScope上定义了一个方法

$rootScope.method = function(value){
    // wanna give this value to `$scope.value` below:
};

我从另一个$ scope

中调用它
app.controller('some', function($scope){
    $scope.value = null;    
});
<div ng-controller="some">
    <input ng-model="value">
    <button ng-click="method(value)" >Click</button>
</div>

是否有可能(如果是这样,如何?)从$ rootScope上定义的方法访问本地化$ scope并更改其属性?

我认为this会起作用但它没有

$rootScope.method = function(value){
    this.value = value // "this" is not the $scope
};

编辑:实际上它确实有效。在我添加这个演示脚本后发现它确实按照我希望的方式工作

&#13;
&#13;
angular.module('app', [])
  .controller('main', function($rootScope) {
    $rootScope.method = function(value) {
      this.changedValue = 'changed ' + value;
    }
  })
  .controller('some', function($scope) {
    // $scope.changedValue = 'not working';
  })
  .controller('someOther', function($scope) {
    $scope.changedValue = 'this should not change';
  });
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app">
  <div ng-controller="main">
  </div>
  <div ng-controller="some">
    <input ng-model="value"></input>
    <button ng-click="method(value)">Click</button>
    {{changedValue}}
  </div>
  <div ng-controller="someOther">
    {{changedValue}}
  </div>
</div>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:2)

范围是一个分层树,其中rootScope位于顶部,控制器范围作为子范围。如果更改连接到rootscope的值,则两个控制器都可以使用它,即如果在ControllerA中设置$ rootscope.value = 1,则controllerB可以访问$ rootScope.value。

但是,如果可以避免,则不建议将值附加到rootScope。它被视为角度的不良做法,类似于在javascript中设置全局值。

更好的方法是创建服务并将其注入两个控制器。此服务可以包含两个控制器所需的任何方法或值。您可以使用controllerA中定义的方法调整服务中的值,并访问controllerB中的服务值。

或者你可以使用$ broadcast来触发自定义事件。它沿着范围链传递,因此在controllerA:

$rootScope.$broadcast('CUSTOM_EVENT_NAME', args);

controllerB

$scope.$on('CUSTOM_EVENT_NAME', function(ev, args) {
  //some code here
  //args are those passed from controllerA
});

但我建议将服务作为更好的方式

答案 1 :(得分:0)

你可以这样做:

$rootScope.method = function(value){
    // wanna give this value to `$scope.value` below:
   $rootScope.value=value;
};


app.controller('some', function($scope,$rootScope){
    $rootScope.value = null;    
});

HTML:

<div ng-controller="some">
    <input ng-model="value">
    <button ng-click="method(value)" >Click</button>
</div>