在我的AngularJS应用程序中,我有两个视图itemList
和favorites
,常见的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(...)
没有意义,因为每次视图更改都会触发侦听器。
因此,我试图通过在$on
和FavoritesCtrl
内监听$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
对其父级收到的某些事件做出反应。我希望有一些方法可以将所有父事件传播给它的孩子(没有像上面这种情况那样无限地生成这些事件)。
答案 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 - 视图即将进入并成为活动视图。
这意味着只要任何视图发生变化,此事件就会广播。
因此,您可以广播您尝试过的自定义事件,或者引入可以在控制器之间进行通信的服务。