使用搜索从JSON填充表

时间:2015-04-27 22:27:52

标签: javascript html json angularjs angularjs-ng-repeat

我能够从JSON对象中纯粹实现网格 - AngularJS ng-repeat to populate grid from array。但是,由于添加索引的性质,能够使用ng-modelfilter:search创建搜索栏不起作用 - 它只能搜索每个表格行中的第一个。

var test= angular.module("app", []);

test.controller("appControl", function($scope, $http) {
	$http.get("http://www.w3schools.com/angular/customers.php")
		.success(function (response) {
			$scope.data = response.records;
		}
	);
    $scope.getFiltered= function(obj, idx){
       //Set a property on the item being repeated with its actual index
       //return true only for every 1st item in 5 items
       return !((obj._index = idx) % 5);
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<body ng-app='app' ng-controller='appControl'>
    <input type='text' ng-model='search.Country' />
    <table>
        <tr ng-repeat="work in data | filter:getFiltered | filter:search">
            <td>{{work.Country}}</td>
            <td>{{data[work._index+1].Country}}</td>
            <td>{{data[work._index+2].Country}}</td>
            <td>{{data[work._index+3].Country}}</td>
            <td>{{data[work._index+4].Country}}</td>
        </tr>
    </table>
</body>

data的长度可能会导致表格看起来像一个完美的矩形。

我正在努力创建一个函数来拆分数组并在JavaScript中创建网格,但我仍然不确定如何通过搜索输入过滤它。

第二次尝试(使用上述功能,但根本没有过滤器......):

var test= angular.module("app", []);

function createGrid(arr, width) {
    newArr = [];
    reps = Math.ceil(arr.length/width) * width;
    k = 0;
    for (var i = 0; i < reps/width; i++) {
        newArr[i] = [];
    }
    
    for (var i = 0; i < reps/width; i++) {
        for (var j = 0; j < width; j++) {
            (arr[k]) ? newArr[i][j] = arr[k] : newArr[i][j] = "";
            //console.log(i, j, arr[k]);
            k++;
        }
    }
    
    return newArr;
}

test.controller("appControl", function($scope, $http) {
    $scope.gridWidth = 4;
	$http.get("http://www.w3schools.com/angular/customers.php")
		.success(function (response) {
			$scope.data = createGrid(Object.keys(response.records).map(function(k) { return response.records[k] }), $scope.gridWidth);
		}
	);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<body ng-app='app' ng-controller='appControl'>
    <input type='text' ng-model='search.Country' />
    <table>
        <tr ng-repeat="row in data">
            <td ng-repeat='work in row'>
                {{ work.Country }}
            </td>
        </tr>
    </table>
</body>

2 个答案:

答案 0 :(得分:3)

您可以尝试这样的事情:

&#13;
&#13;
var test= angular.module("app", []);
  
test.controller("appControl", function($scope, $http) {

	$http.get("http://www.w3schools.com/angular/customers.php")
		.success(function (response) {
	         $scope.data = response.records;
                 $scope.filteredData= response.records;
		}
	);

     $scope.$watch('search', function () {

      var array=[];
      for(var i in $scope.data)
      {
          if($scope.search==undefined || $scope.search.length == 0 ||  ($scope.data[i].Country!=undefined&&$scope.data[i].Country.toUpperCase().startsWith($scope.search.toUpperCase()))){
             array.push($scope.data[i]);
          }
      }
      $scope.filteredData=array;
    });

    $scope.getFiltered= function(obj, idx){
       //Set a property on the item being repeated with its actual index
       //return true only for every 1st item in 3 items
       return !((obj._index = idx) % 5);
    }
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<body ng-app='app' ng-controller='appControl'>
    <input type='text' ng-model='search' />
    <table>
        <tr ng-repeat="work in filteredData | filter:getFiltered | filter:search">
            <td>{{work.Country}}</td>
            <td ng-show="filteredData[work._index+1]">{{filteredData[work._index+1].Country}}</td>
            <td ng-show="filteredData[work._index+2]">{{filteredData[work._index+2].Country}}</td>
            <td ng-show="filteredData[work._index+3]">{{filteredData[work._index+3].Country}}</td>
            <td ng-show="filteredData[work._index+4]">{{filteredData[work._index+4].Country}}</td>
        </tr>
    </table>
</body>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

您可以在成功进行Ajax调用后以及每次模型search更改时预过滤项目。

  1. 将之前过滤的项目保存到$scope.workers
  2. 使用$scope.$watch来监控模型search
  3. 中的更改
  4. 使用函数searched(data)使用indexOf方法过滤搜索字段中包含字符的条目。如果过滤器为空,则还会显示每个项目(typeof $scope.search == 'undefined')。
  5. 如果您希望搜索不区分大小写,请在使用search
  6. 时转换.toLowerCase()和国家/地区.indexOf()

    然后你只需要一个Angular过滤器$scope.getFiltered(),它确保条目是五行。

    &#13;
    &#13;
    var test= angular.module("app", []);
    
    test.controller("appControl", function($scope, $http) {
    	$http.get("http://www.w3schools.com/angular/customers.php")
    		.success(function (response) {
    			$scope.data = response.records;
                $scope.workers = $scope.searched($scope.data);
    		}
    	);
    
        $scope.getFiltered= function(obj, idx){
           //Set a property on the item being repeated with its actual index
           //return true only for every 1st item in 5 items
           return !((obj._index = idx) % 5);
        };
      
        $scope.searched = function (data) {
          var array = [];
          var max = 0;
          
          if (typeof data === 'object') {
            max = data.length;
          }
          
          for (var i = 0; i < max; i += 1) {
            if (typeof $scope.search == 'undefined' || data[i].Country.toLowerCase().indexOf($scope.search.toLowerCase()) != -1) {
              array.push(data[i]);
            }
          }
          
          return array;
        
        };
    
        $scope.$watch('search', function () {
          $scope.workers = $scope.searched($scope.data);
        })
    });
    &#13;
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
    <body ng-app='app' ng-controller='appControl'>
        <input type='text' ng-model='search' />
        <table>
            <tr ng-repeat="work in workers | filter:getFiltered">
                <td>{{ work.Country }}</td>
                <td>{{ workers[$index+1].Country }}</td>
                <td>{{ workers[$index+2].Country }}</td>
                <td>{{ workers[$index+3].Country }}</td>
                <td>{{ workers[$index+4].Country }}</td>
            </tr>
        </table>
    </body>
    &#13;
    &#13;
    &#13;