我在$ 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
};
编辑:实际上它确实有效。在我添加这个演示脚本后发现它确实按照我希望的方式工作
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;
答案 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>