从"根"控制器访问"当前"范围

Pro*_*ofK 8 javascript angularjs

我有一个控制器,我认为是我的"根"控制器,它是一个声明ng-controller属性的控制器,然后是一些其他控制器,通过一个动态实例化$routeProvider.我想声明一个可以通过ng-click任何动态/子控制器范围内的属性使用的函数.

我可以在我的根控制器上声明该函数,例如

$scope.announce = function () {
    alert($scope.specificName);
}
Run Code Online (Sandbox Code Playgroud)

然后我在所有'子'控制器的所有范围内看到它,但是$scope此函数中使用的是根控制器的本地,而不是当前活动的范围/控制器.如何在此功能中访问活动的子范围?

Oka*_*ari 5

我在这个吸管中有一些工作,包括一些用例.

该函数将采用参数.此参数在每个范围中具有相同的名称.

<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.这在角度上不是一个好习惯.

希望这能解决你的问题,或提供足够的线索.

随意询问更具体的事情我会编辑答案以使其适应您的需求.


Cer*_*rus 3

您可以将子作用域作为参数传递:

在你的“根”控制器中:

$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)

这样做的优点是,您可以在子控制器中使用相同的代码,并且如果必须编辑功能,则只需修改根控制器中的功能。