0

在我的AngularJS應用程序的內部,我有兩個視圖itemListfavorites,將常見的HTML代碼分成自定義指令listView。 爲了區分的意見,我附上不同的控制器的意見:如何將AngularJS事件重新廣播給子範圍?

// 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(...)沒有意義,因爲聽衆將在每次視圖更改時觸發。

因此,我試圖通過在FavoritesCtrl$broadcast之間傾聽$on來傳播活動 - 將其應用到其子範圍。如果我廣播自定義事件,則此解決方案有效但我如何重播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對其父母收到的部分活動做出反應。我希望有一些方法可以將所有父母的事件傳播給子女(不會像上述情況那樣無限制地產生這些事件)。

+1

確實是第一次$廣播的作品?你想多次播放$廣播嗎? – Reza

+0

如果同一個事件觸發'$ broadcast'無限次地工作,但是我希望它只能通過父事件 –

+0

仍然不清楚的事件! 「每個父事件只能通過一次事件」是什麼意思? – Reza

回答

0

您不能重新播放相同的事件。您無法控制'$ionicView.beforeEnter'。根據documentation

$ ionicView.beforeEnter - 視圖即將進入併成爲活動視圖。

這意味着每當任何視圖發生變化時都會廣播該事件。

因此,您可以廣播您嘗試的自定義事件或引入可以在控制器之間進行通信的服務。

+0

謝謝@Reza,爲您的答案。不幸的是,答案並不準確。此外,我已經想出瞭解決我的問題的代碼。 –

0

回答我自己的問題,這是一種方法。

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

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

此代碼傳播特定事件的直接孩子(子作用域),但它是不切實際的更深範圍築巢的情況下(你可以確保活動達到你的目標範圍,但你必須要更新鏈中的所有範圍都要重發相同的事件)。

不幸的是,Angular似乎沒有提供一個方便的方式來收聽所有的事件,因此我不會向任何人推薦這個解決方案。而且我也會考慮其他可能性。

我仍然非常感謝來自有經驗的Angular開發人員在哪裏尋找更好的解決方案的意見。

+0

'$ scope。$ broadcast(event.name)'和$ scope。$ broadcast('myCustomEvent')有什麼區別? – Reza

+0

這只是一種編碼風格偏好。我發現前者更好,因爲你只需要在一個地方修改事件名稱。在後一種情況下,你只需要做兩次。如果用事件的名稱替換'event.name',代碼也可以工作。 :) –