Ng-hide и показать в ng-repeat

Я пытаюсь заставить кнопку переключаться только по нажатой кнопке, но поскольку я использую ng-repeat, все меняется вместе. Как мне исправить это так, чтобы оно менялось только при нажатии?

HTML:

        <ul>
            <li class = "displaySubCategory" ng-repeat = "communityTheme in community | startFrom:currentPage*pageSize | limitTo:pageSize">
              <div class = "categoryImg">
                <img src = "img/csvIcon.png" />
                <img src = "img/shpIcon.png" />
              </div>
              <div class = "categoryDesc">
                <p>{{communityTheme.THEMENAME}}</p>
                <a ng-href = "https://assets.onemap.sg/shp/{{SHPFile}}" ng-click = "getSHP(communityTheme.QUERYNAME)" target = "_blank" download>SHP</a> |
                <a ng-href = "https://assets.onemap.sg/kml/{{KMLFile}}" ng-click = "getKML(communityTheme.QUERYNAME)" target = "_blank" download>KML</a> |
                <a href = "" ng-show = "viewMarker" ng-click = "getMapData(communityTheme.QUERYNAME)">View on Map</a>
                <a href = "" ng-hide = "viewMarker" ng-click = "getMapData(communityTheme.QUERYNAME)">Remove Marker</a>
                <!-- <a href = "" ng-click = "getData(communityTheme.QUERYNAME)" download>View Data</a> -->
              </div>
            </li>
        </ul>

JS:

        $scope.viewMarker = true;
        $scope.getMapData = function (msg) {
        $scope.viewMarker = !$scope.viewMarker;
        }

До:

Ng-hide и показать в ng-repeat

После:

Ng-hide и показать в ng-repeat

Измененный код:

            $scope.viewMarker = true;
            $scope.getMapData = function (msg, passedIndex) {
              if ($scope.community[passedIndex].visibility)
              {
                $scope.community[passedIndex].visibility =false;
              }  else {
                $scope.community[passedIndex].visibility = true;
              }

              $scope.viewMarker = !$scope.viewMarker;
<ul>
     <li class = "displaySubCategory" ng-repeat = "communityTheme in community | startFrom:currentPage*pageSize | limitTo:pageSize">
       <div class = "categoryImg">
         <img src = "img/csvIcon.png" />
         <img src = "img/shpIcon.png" />
       </div>
       <div class = "categoryDesc">
         <p>{{communityTheme.THEMENAME}}</p>
         <a ng-href = "https://assets.onemap.sg/shp/{{SHPFile}}" ng-click = "getSHP(communityTheme.QUERYNAME)" target = "_blank" download>SHP</a> |
         <a ng-href = "https://assets.onemap.sg/kml/{{KMLFile}}" ng-click = "getKML(communityTheme.QUERYNAME)" target = "_blank" download>KML</a> |
         <a href = "" ng-show = "viewMarker" ng-click = "getMapData(communityTheme.QUERYNAME, $index)">View on Map</a>
         <a href = "" ng-hide = "viewMarker" ng-click = "getMapData(communityTheme.QUERYNAME, $index)">Remove Marker</a>
         <!-- <a href = "" ng-click = "getData(communityTheme.QUERYNAME)" download>View Data</a> -->
       </div>
     </li>
 </ul>

поместите логическую переменную для видимости в массив сообщества ... переключите ее значение ...

Akber Iqbal 31.10.2018 07:57

как это сделать @@

HangulSR 31.10.2018 07:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
2
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

DEMO

Как это сделать? Не могли бы вы привести мне пример? И спасибо!

HangulSR 31.10.2018 08:01
Ответ принят как подходящий

это должно помочь прояснить ...

        var app = angular.module("test", []); 
        app.controller("myCtrl", function($scope) {
            $scope.community  = [
                { THEMENAME:"Milk", QUERYNAME:"Milk", visibility:true}
                , { THEMENAME:"Bread", QUERYNAME:"Milk", visibility:true}
                , { THEMENAME:"Cheese", QUERYNAME:"Milk", visibility:true}
                ];

            $scope.getMapData = function(passedQueryName, passedIndex){
                /*do what you were doing, just add this one more point*/
                
                if ($scope.community[passedIndex].visibility) {$scope.community[passedIndex].visibility =false;}
                else {$scope.community[passedIndex].visibility = true;}

            }

        });
<script src = "https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>  


<div ng-app = "test">


                
                <div ng-app = "myShoppingList" ng-controller = "myCtrl">
                  
                    <div ng-repeat = "communityTheme in community ">
                        {{x}}
                        <div class = "categoryDesc">
                            <p>{{communityTheme.THEMENAME}} @ {{$index}}</p>
                            <a ng-href = "https://assets.onemap.sg/shp/{{SHPFile}}" ng-click = "getSHP(communityTheme.QUERYNAME)" target = "_blank" download>SHP</a> |
                            <a ng-href = "https://assets.onemap.sg/kml/{{KMLFile}}" ng-click = "getKML(communityTheme.QUERYNAME)" target = "_blank" download>KML</a> |
                            <a href = "" ng-show = "communityTheme.visibility" ng-click = "getMapData(communityTheme.QUERYNAME, $index)">View on Map</a>
                            <a href = "" ng-hide = "communityTheme.visibility" ng-click = "getMapData(communityTheme.QUERYNAME, $index)">Remove Marker</a>
                            <!-- <a href = "" ng-click = "getData(communityTheme.QUERYNAME)" download>View Data</a> -->
                        </div>

                    </div>
                  
                </div>

                <p>So far we have made an HTML list based on the items of an array.</p>
    </div>

Я отредактировал, чтобы показать вам, как я модифицировал свой, что-то не так? Не работает

HangulSR 31.10.2018 08:23

@HangulSR вы не добавляли видимость как поле в массиве 'community' ... сделайте это также

Akber Iqbal 31.10.2018 09:00

@Alqbal есть ли другой обходной путь, если я не добавляю новое поле?

HangulSR 31.10.2018 09:24

@HangulSR Вы хотите иметь видимость на уровне каждого элемента ... поэтому переменная видимости также должна быть на уровне каждого элемента; вы также можете написать jQuery для переключения классов CSS ... но это похоже на установку велосипедных шин на спортивный автомобиль; AngularJS супер - лучше, чем вы его используете.

Akber Iqbal 31.10.2018 09:40

Но данные, которые у меня есть, извлекаются из api, если я не вставлю новый массив, что мне не очень нравится. Мое плохое за то, что я не сказал должным образом. Тем не менее спасибо за помощь и объяснение!

HangulSR 31.10.2018 09:51

@HangulSR Это совершенно нормально для получения из API, просто убедитесь, что массив, с которым вы сопоставляете ответ от api, имеет это дополнительное поле видимости (которое вы бы инициализировали как true по умолчанию); ... Спасибо за принятие ответ. удачи в технических задачах :)

Akber Iqbal 31.10.2018 09:54

@Alqbal, если я установил свой маркер удаления для другой функции, он говорит, что мой passindex не определен, как это исправить?

HangulSR 01.11.2018 02:42

вы можете перейти к любой функции, но она должна быть определена в определении контроллера ... убедитесь, что вы передаете IndexNumber в качестве параметра во время вызова функции; в случае возникновения проблем обновите свой вопрос кодом и напишите мне сообщение, и я отвечу

Akber Iqbal 01.11.2018 04:32

Вы можете попробовать использовать его, как в приведенном ниже коде, где мы будем создавать динамическую переменную viewMarker в том же объекте и рассматривать ее значение по умолчанию как false и переключать ее в функции getMapData, инвертируя ее значение.

Шаблон:

<ul>
    <li class = "displaySubCategory" ng-repeat = "communityTheme in community | startFrom:currentPage*pageSize | limitTo:pageSize">
        <div class = "categoryImg">
            <img src = "img/csvIcon.png" />
            <img src = "img/shpIcon.png" />
        </div>
        <div class = "categoryDesc">
            <p>{{communityTheme.THEMENAME}}</p>
            <a ng-href = "https://assets.onemap.sg/shp/{{SHPFile}}" ng-click = "getSHP(communityTheme.QUERYNAME)" target = "_blank" download>SHP</a> |
            <a ng-href = "https://assets.onemap.sg/kml/{{KMLFile}}" ng-click = "getKML(communityTheme.QUERYNAME)" target = "_blank" download>KML</a> |
            <a href = "" ng-show = "communityTheme.viewMarker" ng-click = "getMapData(communityTheme)">View on Map</a>
            <a href = "" ng-hide = "communityTheme.viewMarker" ng-click = "getMapData(communityTheme)">Remove Marker</a>
            <!-- <a href = "" ng-click = "getData(communityTheme.QUERYNAME)" download>View Data</a> -->
        </div>
    </li>
</ul>

Контроллер:

$scope.getMapData = function (obj) {
    obj.viewMarker = !obj.viewMarker;
}

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