我有一个控制器,我认为是我的' root'控制器,它是一个用ng-controller
属性声明的控制器,然后是一些通过$routeProvider
动态实例化的其他控制器。我想声明一个可以通过任何动态/子控制器范围内的ng-click
属性使用的函数。
我可以在我的根控制器上声明该函数,例如
$scope.announce = function () {
alert($scope.specificName);
}
然后我在所有“孩子”的所有范围内看到它。控制器,但此函数中使用的$scope
是根控制器的本地,而不是当前活动的范围/控制器。如何在此功能中访问活动的子范围?
答案 0 :(得分:5)
我在这个plunker中有一些工作,包括一些用例。
该功能将采用参数。此参数在每个范围中具有相同的名称。
<body ng-app="MyApp">
<div ng-controller="mainCtrl">
<button ng-click="announce(specificName)">announce in main</button>
<div ng-controller="subCtrl">
<button ng-click="announce(specificName)">announce in sub</button>
</div>
</div>
</body>
你的主控制器看起来像那样:
angular.module('MyApp').controller('mainCtrl', function($scope, ItemService){
$scope.specificName = "I'm main !";
$scope.announce = function(specificName){
alert(specificName);
}
});
只需覆盖子控制器中的“specificName”var:
angular.module('MyApp').controller('subCtrl', function($scope, ItemService){
$scope.specificName = "I'm a sub !";
});
要在纯JS中调用该函数,您可以在每个控制器中执行此操作:
$scope.announce($scope.specificName);
编辑:
我刚刚意识到还有另一种解决方案可以满足您的需求。您可以使用工厂或服务来共享该功能。
服务的外观如何:
myApp.service("AnnounceService",
function(){
var service = {};
service.announce = function(toAnnounce){
alert(toAnnounce);
}
return service;
}
);
控制器的外观如下:
angular.module('MyApp').controller('subCtrl', function($scope, AnnounceService){
$scope.announce = AnnounceService.announce;
$scope.specificName = "I'm a sub !";
//Equivalent
$scope.announce($scope.specificName);
AnnounceService.announce($scope.specificName);
});
这与您需要在每个控制器中声明specificName并将其传递给函数是一回事。但该功能可用于您的应用程序的任何部分。您只需要注入服务和
详细信息:
最后,抽象部分不是函数,而是每个控制器中var的名称。一种传统的命名方式。
如果此var与状态相关,则可以将其添加到状态定义中。 (如果是这种情况,我可以尝试给你一个例子。)
我也不建议给另一个提供完整的$范围。这在角度上不是一个好习惯。
希望这能解决你的问题,或提供足够的线索。
随意询问更具体的事情我会编辑答案以使其适应您的需求。
答案 1 :(得分:3)
您可以将子范围作为参数传递:
在你的&#34; root&#34;控制器:
$scope.announce = function (childScope) {
alert(childScope.specificName);
};
在你的孩子身上&#34;控制器:
$scope.announce($scope);
或者,因为您需要从ng-click
调用该函数:
在你的孩子&#34;控制器:
$scope.callAnnounce = function(){
$scope.announce($scope)
};
这里的优点是您可以在子控制器中使用相同的代码,只需要修改根控制器中的功能,如果您必须编辑功能。