代码之家  ›  专栏  ›  技术社区  ›  kaka1234

angularjs:bind-ui-select-from-json和filter-table

  •  0
  • kaka1234  · 技术社区  · 6 年前

    使用Angularjs 1.3.4。

    我有一个html表,它是从一个web api填充的,在那里我发出一个http请求来获取数据并填充我的html表。我的json示例如下:

    {
        id: 1,
        firstName: "John",
        lastName: "Rein",
        status: 'available'
    },
    {
        id: 2,
        firstName: "David",
        lastName: "Gumry",
         status: 'not available'
    }
    

    现在我在表下面有一个下拉列表,我正在使用ui-select。我想根据json中的状态填充这个下拉列表。例如,在上面的json中,我有两个可用和不可用的状态。我希望我的下拉列表具有这些值。填充下拉列表后,我想根据所选的下拉值筛选表。我的下拉列表是:

      <ui-select tagging ng-model="selected" theme="bootstrap">
        <ui-select-match placeholder="Pick one...">{{$select.selected.value}}</ui-select-match>
        <ui-select-choices repeat="val in values | filter: $select.search track by val.value">
            <div ng-bind="val.value | highlight: $select.search"></div>
        </ui-select-choices>        
    </ui-select>
    

    我在以下位置创建了jsfiddle: https://jsfiddle.net/aman1981/wfL1374x/

    我不知道如何将json的结果绑定到ddl并过滤表。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jbrown    6 年前

    你有一些问题需要处理,包括冗余使用的天然气应用程序和天然气控制器。而且,似乎ui-select最适合使用controllera语法,而controllera语法通常是首选方法。

    在这些更改和其他更改(太多无法列出)之后,下面是工作代码:

    angular.module('myApp', ['ui.select'])
    
      .controller("PeopleCtrl", function($http) {
    
        var vm = this;
    
        vm.people = [];
        vm.isLoaded = false;
        vm.values = [];
    
        vm.loadPeople = function() {
          // *** I had to comment this out as it is not allowed in the SO Code Snippet but is fine for your code
          //$http({
          //  method: 'POST',
          //  url: '/echo/json/',
          //  data: mockDataForThisTest
    
          //}).then(function(response, status) {
          //  console.log(response.data);
          //  vm.people = response.data;
          //});
          vm.people = [{
              id: 1,
              firstName: "John",
              lastName: "Rein",
              status: 'available'
            },
            {
              id: 2,
              firstName: "David",
              lastName: "Gumry",
              status: 'not available'
            }
          ];
    
          vm.values = [...new Set(vm.people.map(obj => ({
            value: obj.status
          })))];
        };
    
        vm.selected = {
          key: null,
          value: null
        };
    
        var mockDataForThisTest = "json=" + encodeURI(JSON.stringify([{
            id: 1,
            firstName: "John",
            lastName: "Rein",
            status: 'available'
          },
          {
            id: 2,
            firstName: "David",
            lastName: "Gumry",
            status: 'not available'
          }
        ]));
      })
    <head>
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    
      <link href="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-select/0.20.0/select.min.css" rel="stylesheet" />
    
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
      <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-sanitize/1.2.23/angular-sanitize.min.js"></script>
      <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-select/0.20.0/select.min.js"></script>
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
    </head>
    
    <body ng-app="myApp">
      <div ng-controller="PeopleCtrl as ctrl">
        <br>
        <p> Click <a ng-click="ctrl.loadPeople()">here</a> to load data.</p>
    
        <h2>Data</h2>
        <div class="row-fluid">
          <table class="table table-hover table-striped table-condensed">
            <thead>
              <tr>
                <th>Id</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Status</th>
              </tr>
            </thead>
            <tbody>
              <tr ng-repeat="person in ctrl.people | filter: {status: ctrl.selected.value} : true">
                <td>{{person.id}}</td>
                <td>{{person.firstName}}</td>
                <td>{{person.lastName}}</td>
                <td>{{person.status}}</td>
              </tr>
            </tbody>
          </table>
        </div>
        <br><br>
    
        <div width="50px">
          <ui-select tagging ng-model="ctrl.selected" theme="bootstrap">
            <ui-select-match placeholder="Pick one...">{{$select.selected.value}}</ui-select-match>
            <ui-select-choices repeat="val in ctrl.values | filter: $select.search track by val.value">
              <div ng-bind="val.value | highlight: $select.search"></div>
            </ui-select-choices>
          </ui-select>
        </div>
      </div>
    </body>