Làm cách nào để chuyển đổi ng-show trong AngularJS dựa trên boolean?


113

Tôi có một biểu mẫu để trả lời tin nhắn mà tôi muốn chỉ hiển thị khi isReplyFormOpenlà đúng và mỗi khi tôi nhấp vào nút trả lời, tôi muốn chuyển đổi xem biểu mẫu có được hiển thị hay không. Tôi có thể làm cái này như thế nào?

Câu trả lời:


218

Bạn chỉ cần chuyển đổi giá trị của "isReplyFormOpen" trên sự kiện ng-click

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

Tôi đang sử dụng chính xác cái này, nhưng vì lý do nào đó mà boolean cục bộ trong ng-click đang "ghi đè" cái tôi đã khai báo trong controller $ scope. Sự cố sẽ biến mất nếu tôi thực hiện chuyển đổi thông qua một chức năng của bộ điều khiển: ng-click = "toggleBoolean ()". Bất kỳ ý tưởng tại sao?
antoine

bạn đã đặt giá trị Boolean với mặc định trong bộ điều khiển chưa? đặt $ scope.isReplyFormOpen = falsel lần đầu tiên trong hàm điều khiển. và thử.
Nitu Bansal

1
Ồ, tôi đã xác định Boolean trong bộ điều khiển. Điều kỳ lạ là giá trị mặc định này đã được đọc chính xác bởi ng-show khi tải trang, nhưng sau khi nhấp vào ng-click, nó sẽ chỉ cập nhật ng-show này chứ không phải những giá trị khác trong trang (tất cả đều xem cùng một Boolean— ít nhất là trên lý thuyết) ...
antoine

3
Đã giải quyết nó. Bởi vì ng-click của tôi được lồng trong một ng-repeat, nó đã tạo ra một phạm vi con ẩn Boolean chính khi bạn cố gắng thay đổi giá trị của nó . Xem stackoverflow.com/questions/15388344/… . Theo các phương pháp hay nhất về Angular, bạn nên coi $ scope là chỉ đọc trong các lệnh.
antoine

Tôi sử dụng thủ thuật của bạn với ng-class: <span ng-click="started=!started" ng-class="started ? 'btn-danger' : 'btn-success' ">+1. Cảm ơn bạn:) ♥.
ivahidmontazer

30

Về cơ bản, tôi đã giải quyết nó bằng cách KHÔNG ghi isReplyFormOpengiá trị bất cứ khi nào nó được nhấp vào:

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

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

ng-initcần thiết không?
Charlie Schliesser

6
@CharlieS Không cần thiết, isReplyFormOpen undefinedban đầu là và!undefined == true
quyền trượng

17

Nếu dựa trên bấm vào đây thì đó là:

ng-click="orderReverse = orderReverse ? false : true"

5

Cần lưu ý rằng nếu bạn có một nút trong Bộ điều khiển A và phần tử bạn muốn hiển thị trong Bộ điều khiển B, bạn có thể cần sử dụng ký hiệu dấu chấm để truy cập biến phạm vi trên các bộ điều khiển.

Ví dụ, điều này sẽ không hoạt động:

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

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

</div>

Để giải quyết vấn đề này, hãy tạo một biến toàn cục (tức là trong Bộ điều khiển A hoặc Bộ điều khiển chính của bạn):

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

Sau đó, thêm tiền tố 'toàn cầu' vào lần nhấp của bạn và hiển thị các biến:

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

Để biết thêm chi tiết, hãy xem các Trạng thái lồng nhau & Chế độ xem lồng nhau trong tài liệu Angular-UI , xem video hoặc đọc các phạm vi hiểu biết .


giải pháp tốt nhất cho các phép toán luận
maverickosama92

0

Đây là một ví dụ để sử dụng lệnh ngclick & ng-if.

Lưu ý : ng-if loại bỏ phần tử khỏi DOM, nhưng ng-hide chỉ ẩn phần hiển thị.

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

Nếu bạn có nhiều Menu với Menu con, thì bạn có thể thực hiện giải pháp dưới đây.

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>

Có hai chức năng tôi đã gọi đầu tiên là ng-click = hasSubMenu ('dashboard'). Chức năng này sẽ được sử dụng để chuyển đổi menu và nó được giải thích trong đoạn mã bên dưới. Ng-class = "{active: isActive ('/ customerCare / transaction')} nó sẽ thêm một lớp đang hoạt động vào mục menu hiện tại.

Bây giờ tôi đã xác định một số chức năng trong ứng dụng của mình:

Đầu tiên, thêm một phụ thuộc $ rootScope được sử dụng để khai báo các biến và hàm. Để tìm hiểu thêm về $ roootScope, hãy tham khảo liên kết: https://docs.angularjs.org/api/ng/service/ $ rootScope

Đây là tệp ứng dụng của tôi:

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

Hàm trên được sử dụng để thêm lớp đang hoạt động vào mục menu hiện tại.

        $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;
            }
        }

Theo mặc định, $ rootScope.showDash và $ rootScope.showCC được đặt thành false. Nó sẽ đóng các menu khi trang được tải lần đầu. Nếu bạn có nhiều hơn hai menu con, hãy thêm tương ứng.

Hàm hasSubMenu () sẽ hoạt động để chuyển đổi giữa các menu. Tôi đã thêm một điều kiện nhỏ

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

nó sẽ vẫn mở menu con sau khi tải lại trang theo mục menu đã chọn.

Tôi đã xác định các trang của mình như:

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

Bạn chỉ có thể sử dụng hàm isActive () nếu bạn có một menu không có menu con. Bạn có thể sửa đổi mã theo yêu cầu của bạn. Hy vọng điều này sẽ giúp ích. Có một ngày tuyệt vời :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.