Search code examples
angularjsangularjs-ng-repeatng-showng-hide

ng-hide or ng-show does not work if its controlled from within a ng-repeat


I am trying to hide the div if any of the buttons in the ng-repeat is clicked. However it doesn't seem to work, it leads me to think if ng-hide or ng-show won't work if it is controlled from within a ng-repeat?

<div data-ng-hide="showChooseHardware">
    <table class="table">
        <tbody>
            <tr data-ng-repeat="hardware in hardwares">
                <td>{{hardware.name}}</td>
                <td>
                    <button type="button" class="btn" data-ng-click="showChooseHardware=!showChooseHardware"/>
                </td>
            </tr>
        </tbody>
    </table>
</div>

Solution

  • This is due to the fact that ng-repeat creates a new scope for each template and due to how prototypal inheritance works in JavaScript (and AngularJS).

    Use an object:

    $scope.viewModel = { showChooseHardware: false };
    

    HTML:

    data-ng-hide="viewModel.showChooseHardware"
    

    And:

    data-ng-click="viewModel.showChooseHardware=!viewModel.showChooseHardware"
    

    A great explanation on the issue can be found here.

    I recommend using ng-showinstead in this case since the variable is called showChooseHardware.