부울을 기반으로 AngularJS에서 ng-show를 어떻게 토글합니까?


113

isReplyFormOpen참일 때만 표시하고 싶은 메시지에 답장하는 양식이 있는데 , 답장 버튼을 클릭 할 때마다 양식 표시 여부를 전환하고 싶습니다. 어떻게 할 수 있습니까?

답변:


218

ng-click 이벤트에서 "isReplyFormOpen"값을 토글하면됩니다.

<a ng-click="isReplyFormOpen = !isReplyFormOpen">Reply</a>
 <div ng-show="isReplyFormOpen" id="replyForm">
   </div>

나는 이것을 정확히 사용하고 있었지만 어떤 이유로 ng-click의 로컬 부울은 컨트롤러 $ scope에서 선언 한 것을 "무시"했습니다. 컨트롤러의 기능을 통해 토글을 수행하면 문제가 사라집니다 : ng-click = "toggleBoolean ()". 왜 그런지 아세요?
antoine 2015

컨트롤러에서 기본값으로 부울 값을 설정 했습니까? 컨트롤러 함수에서 $ scope.isReplyFormOpen = falsel 처음 설정하고 시도하십시오.
Nitu Bansal 2015

1
오, 컨트롤러에서 부울을 정의했습니다. 이상한 점은이 기본값이 페이지로드시 ng-show에서 올바르게 읽혔지만 ng-click을 클릭하면이 ng-show 만 업데이트하고 페이지의 다른 사용자는 업데이트하지 않는다는 것입니다 (모두 동일한 Boolean을보고 있습니다. ) 이론 적어도 ...
앙투안

3
해결했습니다. 내 ng-click이 ng-repeat에 중첩 되었기 때문에 값을 변경하려고 할 때 부모 부울을 숨기는 자식 범위를 만들었습니다 . stackoverflow.com/questions/15388344/…를 참조하십시오 . Angular 모범 사례에 따르면 $ scope를 지시문에서 읽기 전용으로 취급해야합니다.
antoine

나는 당신의 속임수를 사용한다 ng-class: <span ng-click="started=!started" ng-class="started ? 'btn-danger' : 'btn-success' ">+1. 감사합니다 :) ♥.
ivahidmontazer

30

나는 기본적으로 그것을 해결 하지 -ing isReplyFormOpen가 클릭 할 때마다 값을 :

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

<div ng-init="isReplyFormOpen = false" ng-show="isReplyFormOpen" id="replyForm">
    <!-- Form -->
</div>

인가 ng-init필요?
Charlie Schliesser 2014-08-13

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 = {};
}

그런 다음 클릭에 '전역'접두사를 추가하고 변수를 표시합니다.

<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>

자세한 내용 들어, 체크 아웃 각도-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 () 함수를 사용할 수 있습니다. 요구 사항에 따라 코드를 수정할 수 있습니다. 이것이 도움이되기를 바랍니다. 좋은 하루 되세요 :)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.