如何将AngularJS事件重新广播到子范围?

时间:2015-11-05 09:21:54

标签: javascript angularjs cordova angularjs-scope ionic-framework

在我的AngularJS应用程序中,我有两个视图itemListfavorites,常见的HTML代码分为自定义指令listView。 为了区分视图,我将不同的控制器附加到视图中:

// itemList.html, controlled by ListCtrl
<list-view ng-controller="ItemListCtrl"></list-view>
...
// favorites.html, controlled by FavoritesCtrl
<list-view ng-controller="FavoritesListCtrl"></list-view>

现在我希望FavoritesListCtrl修改其本地$scope,以防父母(FavoritesCtrl)收到特定的视图更改事件(即$ionicView.beforeEntered)。

据我了解,这些与视图更改相关的事件是从$rootScope向下广播的,但是监听$rootScope.$on(...)没有意义,因为每次视图更改都会触发侦听器。

因此,我试图通过在$onFavoritesCtrl内监听$broadcast来宣传该事件,并将其传播到其子范围。如果我广播自定义事件,此解决方案。但是,如何重新广播FavoritesCtrl收到的同一事件

一点背景:我正在开发一个带有Ionic框架的PhoneGap / Cordova应用程序,严重依赖AngularJS功能。非常感谢任何想法,建议,提示和反馈。

更新 这是我FavoritesListCtrl内部的代码无法捕捉父母的事件:

$scope.$on('$ionicView.beforeEnter', function () {
    console.log('Inside FavoritesListCtrl: $ionicView.beforeEnter');
    ...
});

这会导致无限的事件:

// FavoritesCtrl
$scope.$on('$ionicView.beforeEnter', function () {
    $scope.$broadcast('$ionicView.beforeEnter');
)};

// FavoritesListCtrl
$scope.$on('$ionicView.beforeEnter', function () {
    console.log('Inside ListCtrl: $ionicView.beforeEnter');
});

这有效:

// FavoritesCtrl
$scope.$broadcast('myCustomEvent');

// FavoritesListCtrl
$scope.$on('myCustomEvent', function () {
    console.log('Inside ListCtrl: $ionicView.beforeEnter');
});

问题是,为每个父事件定义自定义事件没有多大意义。请记住,我希望FavoritesListCtrl对其父级收到的某些事件做出反应。我希望有一些方法可以将所有父事件传播给它的孩子(没有像上面这种情况那样无限地生成这些事件)。

2 个答案:

答案 0 :(得分:1)

回答我自己的问题,这是一种方法。

$scope.$on('$ionicView.beforeEnter', function (event, args) {
    if (!args.rebroadcasted) {
        console.log('Re-broadcasting!');

        $scope.$broadcast(event.name, {
            rebroadcasted: true
        });
    }
});

此代码将特定事件传播到直接子节点(子范围),但是在更深的范围嵌套情况下它是不切实际的(您可以确保事件到达目标范围,但是您必须更新所有范围)链重新发送相同的事件)。

不幸的是,Angular似乎没有提供一种方便的方式来监听所有事件,因此我不会向任何人推荐这个解决方案。我也将考虑其他可能性。

我仍然非常感谢有经验的Angular开发者关于在哪里寻找更好的解决方案的意见。

答案 1 :(得分:0)

您无法重新播放同一事件。您无法控制'$ionicView.beforeEnter'。根据{{​​3}}

  

$ ionicView.beforeEnter - 视图即将进入并成为活动视图。

这意味着只要任何视图发生变化,此事件就会广播。

因此,您可以广播您尝试过的自定义事件,或者引入可以在控制器之间进行通信的服务。