如何使用angularjs添加动态过滤功能来处理高级搜索?

问题描述 投票:1回答:1

以下是高级搜索的表单:

Advanced Search Box

我能够为文档部分创建URL和参数,但我无法想到处理“添加属性限制”部分的过程,因为该属性最多可以添加5次,这取决于最终用户。

如下:

Advanced with Dynamic User Entries

所以我想在AngularJS中处理它,在移动中添加/删除和动态更改,并形成URL(GET / POST)以发送数据以便搜索到后端的API。

javascript angularjs dynamic advanced-search
1个回答
1
投票

您可以使用模型中的对象数组来处理此问题。

你的模型的结构将是这样的

let dataModel = {
      'allwords': '',
      'exact_phrase':'',
      /// .. the rest of your basic search model variables

      'property_res': [ {'property':'','action':'contains','value':'','logical_operator':'and'} ]
}

在模板中,您将使用ng-repeat of dataModel['property_res']动态生成属性限制列表

至于“添加属性” - 你只需实现点击处理程序,它将另一个对象(与初始行具有相同的结构)附加到你的dataModel['property_res'],ng-repeat将处理其余部分。

要获取POST请求的值,您可以简单地遍历dataModel['property_res']数组并构造变量,或者只需JSON.serialize()并在服务器端处理它。

希望这会让你前进!

编辑

添加ng-repeat渲染的示例:

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

app.controller('mainController', function($scope, $http) {
    
   $scope.dataModel = {
      'property_res': [ {'property':'','action':'contains','value':'','logical_operator':'and'} ]
   }
   
   $scope.addRow = function(){
      $scope.dataModel['property_res'].push({'property':'','action':'contains','value':'','logical_operator':'and'})
   }
   $scope.showModel= function(){
      console.log($scope.dataModel)
   }
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
 
<div ng-app="app">
  <div ng-controller="mainController">
    
     <h1>Property restrictions:</h1>
     <div ng-repeat="ps in dataModel.property_res">
       <select ng-model="ps.property">
         <option value="">Pick property</option>
         <option value="Property 1">Property 1</option>
         <option value="Property 2">Property 2</option>
       </select>
       <select ng-model="ps.action">
         <option value="doesn't contain">doesn't contain</option>
         <option value="contains">contains</option>
         
       </select>
       <input ng-model="ps.value">
       <select ng-model="ps.logical_operator">
         <option value="or">or</option>
         <option value="and">and</option>
         
       </select>
     </div>
     <hr>
     <div><button ng-click="addRow()">Add Row</button></div>
     <hr>
     <div><button ng-click="showModel()">Console Log Model</button></div>
  </div>
</div>
© www.soinside.com 2019 - 2024. All rights reserved.