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