Rozwiń i zwiń za pomocą kątowego js

Próbuję wymyślić sposób na rozszerzenie i zwinięcie za pomocą angular js. Nie udało mi się znaleźć eleganckiego sposobu, aby to zrobić bez manipulowania obiektami dom w kontrolerze (co nie jest kanciastym sposobem). Obecnie mam ładny sposób, aby to zrobić dla jednej warstwy rozwiń i zwiń. Jednak kiedy zaczynam zagnieżdżać, sprawy się komplikują i nie działają tak, jak chcę (rozszerzanie i zapadanie się wielu obszarów, gdy nie powinno być). Problem przychodzi mi nie wiedząc jak aby wysłać unikalny identyfikator z ng-Kliknij, aby tylko rozwinąć / zwinąć odpowiednią treść. Powinienem wspomnieć, że te elementy są w ng-repeat, więc mogę koniecznie dostosować parametry wysyłane.

Udało mi się użyć tego jsfiddle, aby pomóc mi rozwinąć i zwinąć jedną warstwę do pracy. Jednak jest to Przełącznik sposób, aby to zrobić i chcę, aby użytkownik był w stanie utrzymać rzeczy rozszerzone podczas rozszerzania innych. Więc co zrobiłem, aby naprawić to było użycie tablicy i za każdym razem coś jest kliknięcie indeks tego klikniętego elementu zostanie dodany do tablicy i klasa zostanie rozszerzona. Gdy użytkownik kliknął ponownie indeks został usunięty z tablicy i obszar został zwinięty.

Innym sposobem, który odkryłem, że możesz to zrobić, jest użycie dyrektyw. Ale tak naprawdę nie mogę znaleźć żadnego przykładu, aby zawinąć głowę wokół tego, jak działają dyrektywy. Nie jestem pewien, jak zacząć pisać dyrektywy.

Moja obecna konfiguracja jest taka:

function Dexspander($scope) {
    $scope.ExpandArray = [];

    //Push or pop necessary elements for tracking
    $scope.DespopulatArray = function (identifier, element) {
    if (_.indexOf($scope.ExpandArray, identifier + element) != -1) {
            $scope.ExpandArray.splice(_.indexOf($scope.ExpandArray, identifier + element), 1);
        } else {
            $scope.ExpandArray.push(identifier + element);
        }
    }

    //Change class of necessary elements
    $scope.Dexspand = function (identifier, element) {
        if (_.indexOf($scope.ExpandArray, identifier + element) != -1) {
            return "expand";
        } else {
            return "collapse";
        }
    }
}

<div class="user-header" ng-repeat="user in users">
    <h1 ng-click="DespopulatArray('user', $index)">Expand</h1>
</div>
<div class="user-content" ng:class="Dexspand('user', $index)">
    <div class="content">
        <div class="user-information">
            <div class="info-header">
                <h1 ng-click="DespopulatArray('info', $index)>Some Information</h1>
            </div>
            <div class="info-contents" ng:class="Dexspand('info', $index)">
                stuff stuff stuff stuff...
            </div>
        </div>
    </div>
</div>

Problem z tą konfiguracją polega na tym, że jeśli mam do rodzica divs expanded i te oba mają coś pod nimi do rozwinięcia, kliknięcie ROZWIŃ TEKST rozwinie je w obu obszarach, ponieważ nie są one unikalne.

Author: dain, 2012-09-26

6 answers

Problem pojawia się przeze mnie nie wiedząc, jak wysłać unikalny identyfikator za pomocą ng-click, aby tylko rozwinąć/zwinąć odpowiednią treść.

Możesz przekazać {[2] } za pomocą ng-click (zdarzenia ng - dblclick i ng-mouse), następnie możesz określić, który element spowodował Zdarzenie:

<a ng-click="doSomething($event)">do something</a>

Kontroler:

$scope.doSomething = function(ev) {
    var element = ev.srcElement ? ev.srcElement : ev.target;
    console.log(element, angular.element(element))
    ...
}

Zobacz też http://angular-ui.github.com/bootstrap/#/accordion

 15
Author: Mark Rajcok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-17 15:42:05

Możesz rozwiązać to w pełni w html:

<div>
  <input ng-model=collapse type=checkbox>Title
  <div ng-show=collapse>
     Only shown when checkbox is clicked
  </div>
</div>

Działa to również dobrze z ng-repeat, ponieważ utworzy lokalny zakres dla każdego elementu.

<table>
  <tbody ng-repeat='m in members'>
    <tr>
       <td><input type=checkbox ng-model=collapse></td>
       <td>{{m.title}}</td>
    </tr>
    <tr ng-show=collapse>
      <td> </td>
      <td>{{ m.content }}</td>
    </tr>
  </tbody>
</table>

Należy pamiętać, że nawet jeśli powtórzenie ma swój własny zakres, początkowo odziedziczy wartość z collapse z super zakresów. Pozwala to ustawić wartość początkową w jednym miejscu, ale może to być zaskakujące.

Możesz oczywiście zmienić pole wyboru. Zobacz http://jsfiddle.net/azD5m/5/

Aktualizacja fiddle: http://jsfiddle.net/azD5m/374 / oryginalny fiddle używał tagów zamykających </input>, aby dodać etykietę tekstową HTML zamiast używać tagów <label>.

 27
Author: Peter Kriens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-01 16:25:35

Zobacz http://angular-ui.github.io/bootstrap/#/collapse

function CollapseDemoCtrl($scope) {
  $scope.isCollapsed = false;
}



<div ng-controller="CollapseDemoCtrl">
    <button class="btn" ng-click="isCollapsed = !isCollapsed">Toggle collapse</button>
    <hr>
    <div collapse="isCollapsed">
        <div class="well well-large">Some content</div> 
    </div>
</div>
 7
Author: Crystal Gardner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-23 17:17:30

Napisałem prosty zippy / collapsable używając Angular używając ng-show, ng-click I ng-init. Jego zaimplementowane do jednego poziomu, ale można łatwo rozszerzyć do wielu poziomów.

Przypisz zmienną logiczną do ng-show i przełącz ją po kliknięciu nagłówka.

Sprawdź to tutaj Tutaj wpisz opis obrazka

 3
Author: Allzhere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 08:49:06

Tutaj proste i łatwe rozwiązanie na Angular JS przy użyciu ng-repeat, które może pomóc.

var app = angular.module('myapp', []);

app.controller('MainCtrl', function($scope) {

  $scope.arr= [
    {name:"Head1",desc:"Head1Desc"},
    {name:"Head2",desc:"Head2Desc"},
    {name:"Head3",desc:"Head3Desc"},
    {name:"Head4",desc:"Head4Desc"}
    ];
    
    $scope.collapseIt = function(id){
      $scope.collapseId = ($scope.collapseId==id)?-1:id;
    }
});
/* Put your css in here */
li {
  list-style:none;
  padding:5px;
  color:red;
}
div{
  padding:10px;
  background:#ddd;
}
<!DOCTYPE html>
<html ng-app="myapp">
  <head>
    <meta charset="utf-8" />
    <title>AngularJS Simple Collapse</title>
    <script data-require="[email protected]" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.11/angular.min.js" data-semver="1.5.11"></script>
</head>
<body ng-controller="MainCtrl">
<ul>
  <li ng-repeat='ret in arr track by $index'>
    <div ng-click="collapseIt($index)">{{ret.name}}</div>
    <div ng-if="collapseId==$index">
      {{ret.desc}}
    </div>
  </li>
</ul>
</body>
</html>
To powinno spełnić twoje wymagania. Oto działający kod.

Plunkr Link http://plnkr.co/edit/n5DZxluYHi8FI3OmzFq2?p=preview

Github: https://github.com/deepakkoirala/SimpleAngularCollapse

 2
Author: ideeps,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-28 18:10:58

W html

button ng-click="myMethod()">Videos</button>

In angular

 $scope.myMethod = function () {
         $(".collapse").collapse('hide');    //if you want to hide
         $(".collapse").collapse('toggle');  //if you want toggle
         $(".collapse").collapse('show');    //if you want to show
}
 -2
Author: shahzain ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-06 10:57:11