Angular JS - переключатель одиночного контента из списка

Я пытаюсь преобразовать свои базовые кодировки html / jquery в angular. Я новичок в angular, поэтому будет полезен любой указатель на то, как это правильно сделать.

Итак, у меня есть список. Каждый список содержит основной контент и вспомогательный контент, который изначально скрыт. Мне нужно иметь возможность скрывать / отображать конкретное вспомогательное содержимое для каждого списка.

Вот мой базовый код html / jquery:

<style>
.toggler
{
    display: inline-block;
    width: 20px;
    height: 20px;
    font-size:16px;
    text-align: center;
    transition: all 200ms ease-in-out;
}
.toggler.opened
{
    transform: rotate(180deg);
    font-size:22px;
}
.sub-content
{
    display: none;
}
</style>
<!-- this list comes from php loop -->
<li>
    <div class = "row">
        <div class = "col-10">
            MAIN CONTENT HERE
        </div>
        <div class = "col-2">
            <a class = "toggler" href = "javascript:void(0);"><i class = "fa fa-chevron-down"></i></a>
        </div>
    </div>
    <div class = "row sub-content">
        <div class = "col-12">
            SUB CONTENT HERE
        </div>
    </div>
</li>
<li>
    <div class = "row">
        <div class = "col-10">
            MAIN CONTENT HERE
        </div>
        <div class = "col-2">
            <a class = "toggler" href = "javascript:void(0);"><i class = "fa fa-chevron-down"></i></a>
        </div>
    </div>
    <div class = "row sub-content">
        <div class = "col-12">
            SUB CONTENT HERE
        </div>
    </div>
</li>


<script>
    $(".toggler").click(function()
    {
        $(this).toggleClass("opened");
        $(this).closest("li").find(".sub-content").toggle(200);
    });
</script>

А вот мой текущий угловой код:

<style>
.toggler
{
    display: inline-block;
    width: 20px;
    height: 20px;
    font-size:16px;
    text-align: center;
    transition: all 200ms ease-in-out;
}
.toggler.opened
{
    transform: rotate(180deg);
    font-size:22px;
}
</style>

<ul>
    <li data-ng-repeat = "content in contents">
        <div class = "row">
            <div class = "col-10">
                {{content.main}}
            </div>
            <div class = "col-2">
                <a data-ng-click = "toggleSubContent();" class = "toggler {{opened}}"><i class = "fa fa-chevron-down"></i></a>
            </div>
        </div>
        <div class = "row sub-content" data-ng-hide = "hideSubCont">
            <div class = "col-12">
                {{content.sub}}
            </div>
        </div>
    </li>
</ul>

<script>
var app = angular.module('anguApp', []);

app.controller('anguCtrl',function($scope,$http){
    $scope.hideSubCont  = true;
    $scope.opened       = "";

    $scope.contents = [
        {
            main:"MAIN CONTENT HERE",
            sub:"SUB CONTENT HERE"
        },
        {
            main:"MAIN CONTENT HERE",
            sub:"SUB CONTENT HERE"
        },
        {
            main:"MAIN CONTENT HERE",
            sub:"SUB CONTENT HERE"
        }
    ];

    $scope.toggleSubContent = function()
    {
        $scope.opened       = $scope.opened == "opened" ? "" : "opened";
        $scope.hideSubCont  = $scope.hideSubCont ? false : true;
    };
});
</script>
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Знаете ли вы, что директивы являются одной из самых мощных и универсальных функций Angular?
Директивы позволяют расширять HTML новыми элементами и атрибутами и даже создавать собственные структурные директивы для манипулирования DOM. С...
Разница между Angular и React
Разница между Angular и React
React и AngularJS - это два самых популярных фреймворка для веб-разработки. Оба фреймворка имеют свои уникальные особенности и преимущества, которые...
1
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам нужно установить открытый тег для каждого объекта в вашем массиве содержимого.

$scope.contents = [
    {
        main:"MAIN CONTENT HERE",
        sub:"SUB CONTENT HERE",
        open: false
    },
    {
        main:"MAIN CONTENT HERE",
        sub:"SUB CONTENT HERE",
        open: false
    },
    {
        main:"MAIN CONTENT HERE",
        sub:"SUB CONTENT HERE",
        open: false
    }
];

Теперь в вашем ng-repeat вы можете сделать что-то подобное: $ index возвращает индекс содержимого в массиве содержимого нг-класс разрешает динамическое добавление класса к вашему элементу

<ul>
    <li data-ng-repeat = "content in contents">
        <div class = "row">
            <div class = "col-10">
                {{content.main}}
            </div>
            <div class = "col-2">
                <a data-ng-click = "toggleSubContent($index);" class = "toggler" ng-class = "{'opened': content.open}"><i class = "fa fa-chevron-down"></i></a>
            </div>
        </div>
        <div class = "row sub-content" data-ng-hide = "!content.open">
            <div class = "col-12">
                {{content.sub}}
            </div>
        </div>
    </li>
</ul>

После этого вам нужно немного изменить функцию toggleSubContent ().

$scope.toggleSubContent = function(indexContent)
{
    $scope.contents[indexContent].open = !$scope.contents[indexContent].open;
};

Здесь Плукер

Я надеялся не использовать для этого индекс. Но спасибо, подойдет :)

Christopher 02.06.2018 11:52

Другие вопросы по теме