2015-12-24 2 views
0

У меня есть динамически список строили тестов:Как добавить класс в div родителя родителя в Angular JS?

<script id="TestsTemplate" type="text/ng-template"> 
     <article class="tests-main"> 
      <section class="tests"> 
       <div class="test" ng-repeat="test in tests"> 
        <p>Question {{ test.number }}:</p> 
        <div ng-repeat="answer in test.answers"> 
         <div ng-repeat="(key, value) in answer"> 
          <p><button ng-click="processAnswer(value, $event)" class="btn" >&#9675 {{ key }}</button></p> 
         </div> 
        </div> 
       </div> 
     </article> 
    </script> 

, и я хочу, чтобы добавить класс к DIV (класс = «тест»), в котором была нажата кнопка.

Я знаком только с JQuery, и я могу думать только такой подход:

$scope.processAnswer = function(isRight, event) {  
    isRight ? $scope.count++ : $scope.count--; 
    event.target.parentNode.parentNode.parentNode.addClass('hide'); 
} 

Как сделать это в угловом стиле?

РЕДАКТИРОВАТЬ: Мое решение:

ng-class использования и $index:

<div ng-class="($index==selectedIndex) ? 'hide' : 'test'" ng-repeat="test in tests"> 

Контроллер:

$scope.selectedIndex = -1; 
$scope.processAnswer = function(isRight, index) { 
     isRight ? $scope.count++ : $scope.count--; 
     $scope.selectedIndex = index - 1; //$index starts at 0; 
    } 

, где находится indextest.number

+0

Вероятно, следует использовать директиву. В качестве альтернативы вы можете использовать 'ng-class' и on' ng-click' установить переменную на 'test' – Tristan

+0

@Tristan Есть разница? Если я манипулирую DOM так, но в директиве, будет ли это угловым способом? – Infated

+1

Матрицы Dom должны не существовать в контроллерах, службах или слое представления. Причина в том, что «чистое разделение проблем». Директивы являются многоразовыми, проверяемыми и более легкими для обработки зависимостей. Это зависит от того, насколько важны эти методы для вашего проекта. Как я уже упоминал, вы можете легко использовать 'ng-class' в шаблоне, даже не используя контроллер, но это не рекомендуется по указанным выше причинам. – Tristan

ответ

1

Возможно, вы можете использовать ng-class, чтобы применить класс, когда вы устанавливаете значение boolean на true. Например:

<div class="test" ng-repeat="test in tests" ng-class="{'hide' : onProcessAnswer}"> 

и в контроллере

$scope.onProcessAnswer = false; 
$scope.processAnswer = function(isRight, event) { 
     ... 
     $scope.onProcessAnswer = true; 
     ... 
} 
-1

попробовать этот

$(".test").addClass("YourClassHere"); 
+0

OP ищет угловое решение.Это добавит класс во все классы '.test', а не только с нажатием дочернего элемента – Tristan

0

На мой взгляд, Угловая библиотека сделать кодеры сделать менее Dóm вариант.

Вы можете использовать функцию привязки данных для большинства запросов.

Если вы хотите получить родительский элемент и добавить атрибут, просто используйте jQuery или чистый javascript.

2

Попробуйте как этот

angular.element(event.target).parent().parent().addClass("hide"); 

манипулируя йот в HTML не рекомендуется. Вы должны делать свои манипуляции с dom только в директивах.

0

Попробуйте, как простой

$element.parent().addClass('default-class');

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