2014-10-08 51 views
1

我有這個簡單的代碼:Angularjs - 廣播事件被解僱雙

<modal ng-controler="Contacts"> 
//add new contact stuffs 
</modal> 

<div ng-controller="Contacts"> 
// show the new contact when added 
</div> 

.controller('Contacts', function ($scope, contactsFactory) { 

contactsFactory.doSomething(); 
$scope.$on('contacts:addedNewContact', function (event, data) { 

     console.log('yo'); 
}); 
}) 
.factory('contactsFactory', function ($rootScope) { 
var addNew = function (username, email) { //facoltative, we can get them via email OR username 

      return $http({ 
      'method':'POST', 
      'url': appWS + '/api/contact', 
      'data': { 
       'email':email, 
       'username':username 
      } 
      }).then(function (response) { 

      if (response && response.status === 200) { 

       $rootScope.$broadcast('contacts:addedNewContact', response.data); 
      } 

      }).catch(function (err) { 

      $rootScope.$broadcast('contacts:errorAddingNewContact'); 
      $window.console.error('Error while retrieving contact user data: ' + err); 
      }); 
     }; 

    return { 
     'addNew':addNew 
    }; 
}); 

廣播聯繫人:addedNewContact實際上是把控制檯「喲」的2倍。

我不明白爲什麼它會被雙擊而不是一次。

讚賞任何幫助,感謝

+1

在您的模板中,您正在初始化控制器「聯繫人」兩次=兩個列表程序員=兩個「喲」。 – 2014-10-08 11:37:39

+0

現在感謝它的明確:) – sbaaaang 2014-10-08 12:28:40

回答

1

您有使用控制器兩個div,因此它被實例化2次,註冊監聽器和監聽器都將被觸發。

+0

也避免使用$ rootScope。$廣播,它會推動事件通過所有活動範圍,並可能是非常可怕的性能明智。請使用$ rootScope。$ emit和$ rootScope。$ on。 – 2014-10-08 11:42:33

+0

確定但註冊2次一些事件列表是不是真的解決方案,我想我必須使用一個指令,所以不知道 – sbaaaang 2014-10-08 12:20:35

+0

我會移動邏輯的指令,我想,謝謝 – sbaaaang 2014-10-08 12:28:08