ฉันจะสลับ ng-show ใน AngularJS ตามบูลีนได้อย่างไร


113

ฉันมีแบบฟอร์มสำหรับตอบกลับข้อความที่ต้องการแสดงเมื่อisReplyFormOpenเป็นจริงเท่านั้นและทุกครั้งที่คลิกปุ่มตอบกลับฉันต้องการสลับว่าจะแสดงแบบฟอร์มหรือไม่ ฉันจะทำเช่นนี้ได้อย่างไร?

คำตอบ:


218

คุณเพียงแค่ต้องสลับค่าของ "isReplyFormOpen" ในเหตุการณ์ ng-click

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

ฉันกำลังใช้สิ่งนี้ แต่ด้วยเหตุผลบางประการบูลีนท้องถิ่นใน ng-click จึง "ลบล้าง" สิ่งที่ฉันประกาศในขอบเขต $ controller ปัญหาจะหายไปถ้าฉันทำการสลับผ่านฟังก์ชันของคอนโทรลเลอร์: ng-click = "toggleBoolean ()" คิดว่าทำไม?
antoine

คุณตั้งค่าบูลีนด้วยค่าเริ่มต้นในคอนโทรลเลอร์หรือไม่ ตั้งค่า $ scope.isReplyFormOpen = falsel ครั้งแรกในฟังก์ชันคอนโทรลเลอร์แล้วลอง
Nitu Bansal

1
โอ้ฉันกำหนดบูลีนในคอนโทรลเลอร์ สิ่งที่แปลกคือค่าเริ่มต้นนี้ถูกอ่านอย่างถูกต้องโดย ng-show ในการโหลดหน้าเว็บ แต่หลังจากคลิกที่ ng-click มันจะอัปเดตเฉพาะ ng-show นี้เท่านั้นไม่ใช่อื่น ๆ ในหน้า (ทั้งหมดดูบูลีนเดียวกัน - อย่างน้อยก็ในทางทฤษฎี) ...
antoine

3
แก้ไขได้ เพราะ NG-คลิกของฉันถูกซ้อนกันใน ng ซ้ำมันสร้างขอบเขตเด็กที่ซ่อนแม่แบบบูลเมื่อคุณพยายามที่จะเปลี่ยนแปลงความคุ้มค่า ดูstackoverflow.com/questions/15388344/... ตามแนวทางปฏิบัติที่ดีที่สุดของ Angular คุณควรถือว่า $ scope เป็นแบบอ่านอย่างเดียวในคำสั่ง
antoine

ฉันใช้เคล็ดลับของคุณกับ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>

คือng-initจำเป็น?
Charlie Schliesser

6
@CharlieS ไม่จำเป็น isReplyFormOpen เป็นundefinedตอนแรกและ!undefined == true
sceid


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>

ในการแก้ปัญหานี้ให้สร้างตัวแปรส่วนกลาง (เช่นใน Controller A หรือ Controller หลักของคุณ):

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

สำหรับรายละเอียดเพิ่มเติมโปรดดูที่ซ้อนสหรัฐอเมริกาและซ้อนกันชมในเอกสารเชิงมุม-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.