Как сохранить всегда развернутым первый дивизион раскладного дивана, заменяющий выпадающий список в angularjs - PullRequest
0 голосов
/ 20 января 2019

У меня есть некоторый свернутый / развернутый div, который сохраняет первый div всегда открытым при загрузке. Здесь мне нужно оставить открытым первый div, также при изменении данного раскрывающегося списка. Это работает, но если я разверну кого-нибудь и изменю раскрывающийся список, расширенный div также остается расширенным. Я пытался с $ scope.groups [0] .isOpen = true; но это не работает. Может кто-нибудь, пожалуйста, помогите мне вот код ниже.

HTML

<script src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.4/angular-filter.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular-sanitize.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.js'></script>
<script src="script.js"></script>
<link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.css'>

<body ng-app="app">
  <div ng-controller="AccordionDemoCtrl">
    <div class="scroll-div">
      <div style="border:1px solid;" id="anchor{{group.id}}" ng-repeat="group in groups | orderBy:predicate:reverse track by $index">
        <div class="parents" ng-click="open(group)"><i ng-class="{'glyphicon-minus': group.isOpen, 'glyphicon-plus': !group.isOpen}"></i> {{ group.title }}
        </div>

        <ul class="childs" ng-show="($index == 0 && pristine) || group.isOpen">
          <li ng-repeat="item in group.list ">
            <span ng-bind-html="item"></span>
          </li>
        </ul>
      </div>
    </div>
    <button type="button" ng-click="test()">Sort</button>
    <select ng-model="x" ng-change="changeit()">
    <option value="option1">Option 1</option>
    <option value="option2">Option 2</option>
    <option value="option3">Option 3</option>
    </select>

  </div>
</body>

script.js

var app=angular.module('app', ['ui.bootstrap','ngSanitize','angular.filter']);
app.controller('AccordionDemoCtrl', function ($scope,$location,$anchorScroll) {
  $scope.oneAtATime = true;
    $scope.pristine = true;
  $scope.open = function (item) {
    $scope.groups.filter(a=> a ===item).forEach(a=>{
      a.isOpen = !a.isOpen;
    });
    $scope.closeOthers(item);
    $scope.pristine = false;
  }

  $scope.closeOthers = function (item) {
    $scope.groups.filter(a=> a !==item).forEach(a=>{
      a.isOpen = false;
    });
  }

  $scope.groups = [
    {
      title: 'title 1',
      id:'1',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 2',
      id:'2',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 3',
      id:'3',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 4',
      id:'4',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]

    },
    {
      title: 'title 5',
      id:'6',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 6',
      id:'5',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    }
  ];
  $scope.test = function() {
$scope.groups.forEach(a => {a.isOpen = false;});
    $scope.pristine = true;

    $scope.predicate = 'id';
    $scope.reverse = !$scope.reverse;       
  }
 $scope.changeit = function() {

     $scope.groups[0].isOpen = true;

 }
});

1 Ответ

0 голосов
/ 21 января 2019

Вот рабочая ручка с поведением, которое, я думаю, вы хотите: https://codepen.io/Lahikainen/pen/rPBVeO

Вот код с некоторыми изменениями:

РЕДАКТИРОВАТЬ : добавлено поведение переключения для групп

<script src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular-filter/0.5.4/angular-filter.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.1/angular-sanitize.js'></script>
<script src='https://cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/2.5.0/ui-bootstrap-tpls.js'></script>
<script src="script.js"></script>
<link rel='stylesheet prefetch' href='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/css/bootstrap.css'>

<body ng-app="app">
  <div ng-controller="AccordionDemoCtrl">
    <div class="scroll-div">
      <div
        style="border:1px solid;"
        id="anchor{{group.id}}"
        ng-repeat="group in groups track by group.id">

        <div class="parents" ng-click="toggleExpand(group)">
          <i ng-class="{
            'glyphicon-minus': isExpandedGroup(group),
            'glyphicon-plus': !isExpandedGroup(group)}">
          </i>
          {{ group.title }}
        </div>

        <ul class="childs" ng-show="isExpandedGroup(group)">
          <li ng-repeat="item in group.list ">
            <span ng-bind-html="item"></span>
          </li>
        </ul>

      </div>
    </div>
    <button type="button" ng-click="sort()">Sort</button>
    <select ng-model="selectedGroup" ng-options="group.title for group in groups">
      <option>{{ group.title }}</option>
    </select>

  </div>
</body>

контроллер

var app=angular.module('app', ['ui.bootstrap','ngSanitize','angular.filter']);
app.controller('AccordionDemoCtrl', function ($scope,$location,$anchorScroll) {
  $scope.groups = [
    {
      title: 'title 1',
      id:'1',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 2',
      id:'2',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 3',
      id:'3',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 4',
      id:'4',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]

    },
    {
      title: 'title 5',
      id:'6',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    },
    {
      title: 'title 6',
      id:'5',
      list: ['<i>item1a</i> blah blah',
        'item2a',
        'item3a',
        'item4a',
        'item5a',
        'item6a',
        'item7a'
        ]
    }
  ];

  $scope.selectedGroup = $scope.groups[0];
  $scope.sortOrderMultiplier = 1;

  $scope.isExpandedGroup = function (group) {
    return group === $scope.selectedGroup;
  }

  $scope.toggleExpand = function (group) {
    if ($scope.selectedGroup === group) {
      $scope.selectedGroup = undefined;
    } else {
      $scope.selectedGroup = group; 
    }
  }

  $scope.sort = function () {
    $scope.sortOrderMultiplier *= -1;

    $scope.groups.sort(function (a, b) {
      if (a.id > b.id) {
        return 1 * $scope.sortOrderMultiplier;
      }
      if (a.id < b.id) {
        return -1 * $scope.sortOrderMultiplier;
      }
      return 0;
    })
  }
});

Не стесняйтесь задавать вопросы, если что-то неясно.

РЕДАКТИРОВАТЬ Добавить обоснование того, почему я изменил ваш код:

Похоже, одно из ваших требований заключается в том, что за один раз может быть расширена только одна группа. По этой причине я добавил selectedGroup в модель вместо того, чтобы добавлять свойство isOpen в каждую группу.

Этот код без необходимости усложняется, когда все, что вам нужно - это модель selectedGroup: ng-show="($index == 0 && pristine) || group.isOpen"

Ваша функция open получает группу в качестве параметра. Затем вы фильтруете массив groups, чтобы найти ссылку на группу, на которую у вас уже есть ссылка. Затем вы устанавливаете свойство isOpen. Все, что вам нужно сделать для этой функции - это item.isOpen = !item.isOpen; Это то же самое, что и ваша функция closeOthers.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...