访问“当前”'来自' root'的范围控制器

时间:2015-06-03 07:02:37

标签: javascript angularjs

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

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

$scope.announce = function () {
    alert($scope.specificName);
}

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

2 个答案:

答案 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)
};

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