AngularJS получить идентификатор элемента нажал и использовать в контроллере

0

Я только начал изучать AngularJS, и я пытаюсь создать довольно простое веб-приложение. Сейчас у меня есть некоторые пользователи. Каждый пользователь отображается в отдельной таблице, и каждый пользователь имеет свои собственные данные, которые отображаются в таблице под ним. Изображение 174551

$scope.userList = [{username: "Bob_t", detailsId: 1}, {username: "Mike_V", detailsId: 2}];
$scope.userDetails = [{Name: "Bob", Age: 20, id: "1"}, {Name: "Michael", Age: 18, id: "2"}];

Вы можете видеть, что каждый пользователь имеет ссылку на него соответствующие подробности (detailsId в userList соответствует id в userDetails).

В принципе, то, что я пытаюсь сделать, изначально имеет таблицу данных, скрытую для каждого пользователя. И когда кто-то нажимает кнопку "Развернуть" для определенного пользователя, откройте эту таблицу данных соответствующих пользователей и заполните ее данными этого пользователя. У меня возникли проблемы с получением информации с кнопкой clicked expand, а затем с помощью этого для запроса моей БД, чтобы получить правильные данные пользователя, чтобы отобразить в таблице под ним.

<div ng-repeat="user in userList | filter:searchBox">
                    <div class="uk-panel-box-secondary uk-overflow-container tableDiv uk-margin-large-bottom">
                    <table class="uk-table uk-table-hover uk-margin-top">
                        <thead>
                            <tr>
                                <th>Username</th>
                            </tr>
                        </thead>
                    </table>
                    <a class="uk-margin-bottom uk-margin-left" id="expandIcon" ng-click="isOpened=!isOpened; showOrHideDetails(isOpened, param)" ng-class="{'uk-icon-plus-square-o': !isOpened, 'uk-icon-minus-square-o': isOpened}"></a>  
                 </div>  
                 <div class="uk-panel-box-secondary uk-overflow-container uk-margin-top uk-margin-large-left uk-margin-bottom tableDiv">
                    <table class="uk-table uk-table-hover uk-margin-top">
                        <thead>
                            <tr>
                                <th>Name</th>
                                <th>Age</th>
                                <th></th>
                            </tr>
                        </thead>
                          <tr ng-repeat="details in userDetails" id={{user.id}}>
                            <td>{{details.Name}}</td>
                            <td>{{details.Age}}</td>
                            <td>
                                <a href="" class="uk-icon-hover uk-icon-pencil-square-o icons"></a>
                                <a href="" class="uk-icon-hover uk-icon-trash icons uk-text-danger" ng-click="delete($index)"></a>
                             </td>
                          </tr>
                    </table>  
                 </div>  
 </div> 

мой контроллер:

$http({
        method : "GET",
        url : "http://database:8081/userAccounts/"
    }).then(function mySucces(response) {
        $scope.userList = response.data;
    }, function myError(response) {
        // $scope.userList = response.statusText;
    });

    $scope.showOrHideDetails = function(isOpened, param) 

        if(isOpened){
        console.log($scope.id)
        $scope[id] = true;
        console.log($scope.id);
            $http({
                method : "GET",
                url : "http://database:8081/details?id=" + index
            }).then(function mySucces(response) {
                $scope.userDetails = response.data;
            }, function myError(response) {
                $scope.userDetails = response.statusText;
            });

        }
        else{
            $scope.showDetails = false;
        }
    }

Что действительно меня смущает, когда я получаю правильный объект userDetails после запроса БД, как мне заполнить соответствующую таблицу этой информацией?

Я знаю, что мне, вероятно, нужна модель, но это меня смущает, потому что количество пользователей неизвестно.

  • 0
    Таким образом, вы хотите отобразить каждый раз? Значит, когда один открыт, все должны быть закрыты?
  • 0
    Я хочу разрешить открывать несколько файлов одновременно
Показать ещё 2 комментария
Теги:
angularjs-ng-repeat

2 ответа

1
Лучший ответ

Во-первых, ваш код немного запутан.

После каждого запроса вы приписываете ответ (который является подробным userDetails одного пользователя) для всего array userDetails:

$scope.userDetails = response.data;

Хотя это должно быть:

$scope.userDetails.push(response.data);

Кроме того, у вас есть одна переменная с именем isOpened, она не будет работать, потому что у вас есть несколько кнопок только для одной переменной.

Поэтому мое предложение - изменить его на:

<a class="uk-margin-bottom uk-margin-left" id="expandIcon" ng-click="showOrHideDetails(user)" ng-class="{'uk-icon-plus-square-o': !user.isOpened, 'uk-icon-minus-square-o': user.isOpened}"></a>

Также вы должны проверить, находится ли userDetail в вашем массиве userDetails.

Наконец, поскольку вы хотите показать данные на основе пользователя, вы можете использовать собственный filter, потому что у вас уже есть свойство id пользователей в обоих arrays, как показано ниже:

<tr ng-if="user.isOpened" ng-repeat="details in userDetails | filter: { id: user.detailsId }" id={{user.id}}>

Простая демонстрация:

(function() {
  angular
    .module('app', [])
    .controller('MainCtrl', MainCtrl);

  MainCtrl.$inject = ['$scope', '$http'];

  function MainCtrl($scope, $http) {
    $scope.userList = [{
      username: "Bob_t",
      detailsId: 1
    }, {
      username: "Mike_V",
      detailsId: 2
    }];
    $scope.userDetails = [{
      Name: "Bob",
      Age: 20,
      id: "1"
    }, {
      Name: "Michael",
      Age: 18,
      id: "2"
    }];

    $scope.showOrHideDetails = function(user) {
      user.isOpened = !user.isOpened;

      function mySuccess(response) {
        $scope.userDetails.push(response.data);
      }

      function myError(response) {
        console.log(response.statusText);
      }
      
      if (user.isOpened) {
        $http.get('http://database:8081/details?id=' + user.id)
          .then(mySuccess)
          .catch(myError);
      } else {
        $scope.showDetails = false;
      }
    }
  }
})();
<!DOCTYPE html>
<html ng-app="app">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.26.4/js/uikit.min.js"></script>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/uikit/2.26.4/css/uikit.min.css" />
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.6/css/bootstrap.min.css">
</head>

<body ng-controller="MainCtrl">
  <div ng-repeat="user in userList | filter:searchBox">
    <div class="uk-panel-box-secondary uk-overflow-container tableDiv uk-margin-large-bottom">
      <table class="uk-table uk-table-hover uk-margin-top">
        <thead>
          <tr>
            <th>Username</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td ng-bind="user.username"></td>
          </tr>
        </tbody>
      </table>
      <a class="uk-margin-bottom uk-margin-left" id="expandIcon" ng-click="showOrHideDetails(user)" ng-class="{'uk-icon-plus-square-o': !user.isOpened, 'uk-icon-minus-square-o': user.isOpened}"></a>
    </div>
    <div class="uk-panel-box-secondary uk-overflow-container uk-margin-top uk-margin-large-left uk-margin-bottom tableDiv">
      <table class="uk-table uk-table-hover uk-margin-top">
        <thead>
          <tr>
            <th>Name</th>
            <th>Age</th>
            <th></th>
          </tr>
        </thead>
        <tr ng-if="user.isOpened" ng-repeat="details in userDetails | filter: { id: user.detailsId }" id={{user.id}}>
          <td ng-bind="details.Name"></td>
          <td ng-bind="details.Age"></td>
          <td>
            <a href="" class="uk-icon-hover uk-icon-pencil-square-o icons"></a>
            <a href="" class="uk-icon-hover uk-icon-trash icons uk-text-danger" ng-click="delete($index)"></a>
          </td>
        </tr>
      </table>
    </div>
  </div>
</body>

</html>

Я надеюсь, что это помогает!!

0

вы пробовали пропустить пользователя из

<div ng-repeat="user in userList | filter:searchBox">

для функции showOrHideDetails (пользователь)

  • 0
    Это будет работать, но как только у меня будет объект userDetails, как мне показать его в соответствующей таблице этого пользователя ... мне нужно иметь модель и заполнить ее в контроллере ...
  • 0
    показ всплывающего окна будет легкой задачей. Я рекомендую вам расширить представление и подробности.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню