2014-09-23 3 views
0

Я пытаюсь обнаружить документ, щелкнув по странице и манипулируя dom в div. У меня есть что-то вродеКак манипулировать дочерним элементом в моем случае

angular.module('myApp').directive('documentClick', ['$document', function($document) { 
    return function(scope, element, attrs) { 
     element.bind('click', function(e){ 
      console.log('click') 
     }) 
    } 
}]); 


<body ng-app="myApp" ng-controller="ctrl" document-click> 
    <div ng-controller='insideCtrl'> 
     <div id="test"> 
      <p>inside p</p> 
     </div> 
    </div> 
</body> 

Я хочу изменить текст «внутри p» на что-то еще после того, как я нажимаю страницу в любом месте. Как мне это сделать? Благодарю.

+0

С какой целью вы столкнулись с проблемой? Похоже, вы должны легко сузить до этого 'p', выбирая id' test', а затем получая его единственный элемент-потомк. Тогда это просто вопрос обновления текстового контента. Не знаете, о чем именно вы спрашиваете. –

+0

Я хочу сделать это угловым способом. – FlyingCat

ответ

1

Вы можете использовать события, чтобы сделать трюк.

События выпускаются контроллерами, единственным контроллером, который вы можете ввести в свою директиву, является $rootController. Так давайте сделаем это:

// in your directive 
angular.module('...') 
    .directive('documentClick', function ($document, $rootScope) { 
    return function(scope, element, attrs) { 
     element.bind('click', function(e){ 
     $rootScope.$broadcast('documentClicked'); 
     }) 
    } 
    }); 

// in your controller 
angular.module('...') 
    .controller('WhateverCtrl', function ($scope) { 

    $scope.$on('documentClicked', function() { 
     // here it is ! 
    }); 

    }); 

Обратите внимание, что я использовал $scope в контроллере, не $rootScope причины нет необходимости использовать его объявление $broadcast отправляется всем прицелов порожденных. See here for more infos.

Смежные вопросы