2014-12-14 3 views
0

Я пытаюсь реализовать что-то похожее на аккордеон в чистом угловом.Найти все элементы в Угловой директиве

У меня есть список часто задаваемых вопросов, с ответами скрытых (через css display: none;). Я хочу, чтобы он работал так, что, когда вы нажимаете на вопрос, появляется ответ. Если вы снова нажмете на вопрос, ответ снова скрывается.

Это все работает отлично, используя следующую директиву:.

.directive('toggleOpen', function toggleOpen() { 
    return { 
     restrict: 'A', 
     link: function (scope, element, attrs) { 
      element.bind('click', function() { 
       if(element.parent().children().hasClass('open')) { 
        element.parent().children().removeClass('open'); 
       } else { 
        element.parent().children().addClass('open'); 
       } 
      }); 
     } 
    } 
}); 

Так что причина есть куча родителей() дети() вздор часть я не мог работать.

Предположим, у вас есть 2 вопроса, 1 и 2. Когда страница загружается, оба ответа скрыты. Пользователь нажимает на вопрос 1 и отвечает на 1 показ. В настоящее время, когда вы нажимаете на вопрос 2, ответьте на 2 неоткрытых, что также правильно, но я только хочу, чтобы один ответ открывался одновременно. Поэтому, если отображается ответ 1, и пользователь нажимает вопрос 2, я хочу ответить 1, чтобы скрыть, и ответить 2, чтобы показать.

У меня есть класс css 'open', который я применяю, чтобы отображать ответы. Итак, в основном - как я могу найти ВСЕ элементы, имеющие класс 'open', и удалить его, а затем применить его к элементу, на который пользователь нажал?

Есть ли «чистый» угловой способ сделать это?

ТИА

+0

Я понимаю ваше понятие «чистого» углового решения, но почему бы не использовать JQuery в сочетании с угловыми? Затем вы можете использовать селекторную технологию jQuery? Если вы решите не использовать селектор jQuery, вы всегда можете реализовать собственный поиск селектора, используя стандартные функции DOM, и проведите дерево DOM самостоятельно, ища элементы с соответствующим классом. – Kolban

+0

@ Kolban, потому что Angular в значительной степени говорит «не делай этого?». Считается неплохой практикой, чтобы попытаться объединить эти два, поэтому Angular имеет собственную уменьшенную версию jqLite. Совершенно разные (и порой конкурирующие) мысли. – MonkRocker

+0

Это хорошая дискуссия. На домашней странице «Угловая» здесь (https://angularjs.org/) я читал: «Он полностью расширяемый и хорошо работает с другими библиотеками». См. Также официальный FAQ ... (https://docs.angularjs.org/misc/faq), в котором говорится, что МОЖЕТ использовать Angular с полным jQuery. – Kolban

ответ

1

вы могли бы сделать все это с шаблоном логики, никакой директивы не нужны:

<section ng-class="{open: selected=='q1'}"> 
    <question ng-click="selected='q1'" ></question> 
    <answer></answer> 
</section> 
<section ng-class="{open: selected=='q2'}"> 
    <question ng-click="selected='q2'" ></question> 
    <answer></answer> 
</section> 
<section ng-class="{open: selected=='q3'}"> 
    <question ng-click="selected='q3'" ></question> 
    <answer></answer> 
</section> 
+0

Это работало как шарм. Это то, что я получаю от чрезмерного мышления. ;) – MonkRocker

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