Why do I lose one of my event bindings after joining a second time?

So when the user logs in and has unread messages, the user is automatically connected to a private chat with the another user via this event.

channel.on("unread_messages", (users) => {
     if (!users.users[0]) {
      return;
     }

     var new_channel = Chat.createNewPrivateChannel(users.users[0], $rootScope.user.id)

     Chat.connectToPrivateChannel(new_channel).then((private_channel) => {
      $rootScope.privateMessages = Chat.getMessages()
      $rootScope.privateChannel = private_channel
     })
    })

If they don’t have unread messages they have to click on a button to display a chat button that will open a messagebox for them to send messages. The button(not the chat button) calls this function and it is in my chatcontroller.

$scope.startPrivateChat = function(event) {
 var id1 = ($(event.currentTarget).attr("agent-id")); 
 var id2= $rootScope.user.id;

 // this just returns a string private:3:23 for example by sorting
 //  the ids and joining them via colon.
 var new_channel = Chat.createNewPrivateChannel(id1, id2)

 var current_channel = Chat.getPrivateChannel();

 if (current_channel) {
   if (current_channel.topic == new_channel) {
     return;
    }

    Chat.leavePrivateChannel(); // this just does channel.leave() and stop duplicate joins.
 }

 Chat.connectToPrivateChannel(new_channel).then((channel) => {
   $rootScope.privateMessages = Chat.getMessages();
   $rootScope.privateChannel = channel;
   $scope.$apply();
 })
}

Now I have a directive with three isolated scopes and the main parts of that directive that I want to show are these.

return {
restrict: 'E',
scope: {
  user: '=user',
  messages: '=messages',
  channel: '=channel'
},
link: (scope, element, attrs) => {
  ...code
  scope.channel.on("message_created", (message) => {
    $timeout(() => {
      scope.messages.push(message)
      let el = element.find(".messages-container")
      if (el[0].scrollHeight - el.scrollTop() < el[0].clientHeight + 200) {
        setTimeout(() => { el[0].scrollTop = el[0].scrollHeight })
      }
    })
  ... more code goes here

the message_created is an event that gets binded to $rootScope.privateChannel object because of the two way binding.

And in several html pages the html code for my directive looks like this.

 <chatbox
ng-if="privateChannel"
user="user"
channel="privateChannel"
messages="privateMessages">
 </chatbox>

The problem goes like this. If the user has unread messages, then I join that private chat and the message_created event binding is attached to the $rootScope.privateChannel object. Then if I leave that private chat and start another private chat(this is another call to startPrivateChat), I lose the message_create event binding.

Why is that and what can I do to fix that?

Here is an image of what I’m talking about.

Capture