Как переключить ng-show в AngularJS на основе логического значения?

113

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

Liamzebedee
источник

Ответы:

218

Вам просто нужно переключить значение isReplyFormOpen на событие ng-click.

<a ng-click="isReplyFormOpen = !isReplyFormOpen">Reply</a>
 <div ng-show="isReplyFormOpen" id="replyForm">
   </div>
Ниту Бансал
источник
Я использовал именно это, но по какой-то причине локальное логическое значение в ng-click «переопределяло» то, которое я объявил в области контроллера $. Проблема исчезнет, ​​если я сделаю переключение с помощью функции контроллера: ng-click = "toggleBoolean ()". Есть идеи, почему?
антуан
вы установили логическое значение по умолчанию в контроллере? установите $ scope.isReplyFormOpen = falsel в первый раз в функции контроллера. и попробуйте.
Ниту Бансал,
1
О, я определил логическое значение в контроллере. Странно то, что это значение по умолчанию было правильно прочитано ng-show при загрузке страницы, но затем после щелчка по ng-click оно обновляло только это ng-show, а не другие на странице (все смотрят одно и то же логическое значение - по крайней мере, теоретически) ...
антуан
3
Решил это. Поскольку мой ng-click был вложен в ng-repeat, он создал дочернюю область, которая скрывает родительское логическое значение, когда вы пытаетесь изменить его значение . См. Stackoverflow.com/questions/15388344/… . Согласно лучшим практикам Angular, вы должны рассматривать $ scope как директивы только для чтения.
Антуан,
Я использую ваш трюк с ng-class: <span ng-click="started=!started" ng-class="started ? 'btn-danger' : 'btn-success' ">+1. Спасибо :) ♥.
ivahidmontazer
30

В основном я решил это, НЕ устанавливая isReplyFormOpenзначение при каждом нажатии:

<a ng-click="isReplyFormOpen = !isReplyFormOpen">Reply</a>

<div ng-init="isReplyFormOpen = false" ng-show="isReplyFormOpen" id="replyForm">
    <!-- Form -->
</div>
Liamzebedee
источник
Это ng-initнеобходимо?
Чарли Шлиссер
6
@CharlieS Не обязательно, isReplyFormOpen undefinedизначально и!undefined == true
sceid
17

Если на основе щелчка здесь, это:

ng-click="orderReverse = orderReverse ? false : true"
Андрей Моцык
источник
5

Стоит отметить, что если у вас есть кнопка в контроллере A и элемент, который вы хотите отобразить в контроллере B, вам может потребоваться использовать точечную нотацию для доступа к переменной области видимости между контроллерами.

Например, это не сработает:

<div ng-controller="ControllerA">
  <a ng-click="isReplyFormOpen = !isReplyFormOpen">Reply</a>

  <div ng-controller="ControllerB">
    <div ng-show="isReplyFormOpen" id="replyForm">
    </div>
  </div>

</div>

Чтобы решить эту проблему, создайте глобальную переменную (например, в контроллере A или вашем основном контроллере):

.controller('ControllerA', function ($scope) {
  $scope.global = {};
}

Затем добавьте к вашему клику префикс «global» и покажите переменные:

<div ng-controller="ControllerA">
  <a ng-click="global.isReplyFormOpen = !global.isReplyFormOpen">Reply</a>

  <div ng-controller="ControllerB">
    <div ng-show="global.isReplyFormOpen" id="replyForm">
    </div>
  </div>

</div>

Для получения дополнительных сведений ознакомьтесь с вложенными состояниями и вложенными представлениями в документации по Angular-UI , посмотрите видео или прочтите области понимания .

Джеймс Гентес
источник
лучшее решение для логических значений
maverickosama92
0

Вот пример использования директив ngclick & ng-if.

Примечание : ng-if удаляет элемент из DOM, а ng-hide просто скрывает отображение элемента.

<!-- <input type="checkbox" ng-model="hideShow" ng-init="hideShow = false"></input> -->

<input type = "button" value = "Add Book"ng-click="hideShow=(hideShow ? false : true)"> </input>
     <div ng-app = "mainApp" ng-controller = "bookController" ng-if="hideShow">
             Enter book name: <input type = "text" ng-model = "book.name"><br>
             Enter book category: <input type = "text" ng-model = "book.category"><br>
             Enter book price: <input type = "text" ng-model = "book.price"><br>
             Enter book author: <input type = "text" ng-model = "book.author"><br>


             You are entering book: {{book.bookDetails()}}
     </div>

    <script>
             var mainApp = angular.module("mainApp", []);

             mainApp.controller('bookController', function($scope) {
                $scope.book = {
                   name: "",
                   category: "",
                   price:"",
                   author: "",


                   bookDetails: function() {
                      var bookObject;
                      bookObject = $scope.book;
                      return "Book name: " + bookObject.name +  '\n' + "Book category: " + bookObject.category + "  \n" + "Book price: " + bookObject.price + "  \n" + "Book Author: " + bookObject.author;
                   }

                };
             });
    </script>
Абдалла Окаша
источник
0

Если у вас есть несколько меню с подменю, вы можете использовать следующее решение.

HTML

          <ul class="sidebar-menu" id="nav-accordion">
             <li class="sub-menu">
                  <a href="" ng-click="hasSubMenu('dashboard')">
                      <i class="fa fa-book"></i>
                      <span>Dashboard</span>
                      <i class="fa fa-angle-right pull-right"></i>
                  </a>
                  <ul class="sub" ng-show="showDash">
                      <li><a ng-class="{ active: isActive('/dashboard/loan')}" href="#/dashboard/loan">Loan</a></li>
                      <li><a ng-class="{ active: isActive('/dashboard/recovery')}" href="#/dashboard/recovery">Recovery</a></li>
                  </ul>
              </li>
              <li class="sub-menu">
                  <a href="" ng-click="hasSubMenu('customerCare')">
                      <i class="fa fa-book"></i>
                      <span>Customer Care</span>
                      <i class="fa fa-angle-right pull-right"></i>
                  </a>
                  <ul class="sub" ng-show="showCC">
                      <li><a ng-class="{ active: isActive('/customerCare/eligibility')}" href="#/CC/eligibility">Eligibility</a></li>
                      <li><a ng-class="{ active: isActive('/customerCare/transaction')}" href="#/CC/transaction">Transaction</a></li>
                  </ul>
              </li>
          </ul>

Сначала я вызвал две функции: ng-click = hasSubMenu ('dashboard'). Эта функция будет использоваться для переключения меню, и это объясняется в приведенном ниже коде. Ng-class = "{active: isActive ('/ customerCare / transaction')} добавит активный класс в текущий пункт меню.

Теперь я определил несколько функций в своем приложении:

Сначала добавьте зависимость $ rootScope, которая используется для объявления переменных и функций. Чтобы узнать больше о $ roootScope, перейдите по ссылке: https://docs.angularjs.org/api/ng/service/ $ rootScope

Вот мой файл приложения:

 $rootScope.isActive = function (viewLocation) { 
                return viewLocation === $location.path();
        };

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

        $rootScope.showDash = false;
        $rootScope.showCC = false;

        var location = $location.url().split('/');

        if(location[1] == 'customerCare'){
            $rootScope.showCC = true;
        }
        else if(location[1]=='dashboard'){
            $rootScope.showDash = true;
        }

        $rootScope.hasSubMenu = function(menuType){
            if(menuType=='dashboard'){
                $rootScope.showCC = false;
                $rootScope.showDash = $rootScope.showDash === false ? true: false;
            }
            else if(menuType=='customerCare'){
                $rootScope.showDash = false;
                $rootScope.showCC = $rootScope.showCC === false ? true: false;
            }
        }

По умолчанию $ rootScope.showDash и $ rootScope.showCC имеют значение false. Это закроет меню при первоначальной загрузке страницы. Если у вас более двух подменю, добавьте соответственно.

Функция hasSubMenu () будет работать для переключения между меню. Я добавил небольшое условие

if(location[1] == 'customerCare'){
                $rootScope.showCC = true;
            }
            else if(location[1]=='dashboard'){
                $rootScope.showDash = true;
            }

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

Я определил свои страницы как:

$routeProvider
        .when('/dasboard/loan', {
            controller: 'LoanController',
            templateUrl: './views/loan/view.html',
            controllerAs: 'vm'
        })

Вы можете использовать функцию isActive (), только если у вас есть одно меню без подменю. Вы можете изменить код в соответствии с вашими требованиями. Надеюсь, это поможет. Хорошего дня :)

Вайбхав Удджвал
источник