gpt4 book ai didi

javascript - 使用 AngularJS 通过查询数组来创建即时搜索

转载 作者:行者123 更新时间:2023-11-28 00:31:56 25 4
gpt4 key购买 nike

这将是一个相当冗长的问题,所以请耐心等待......

我有大约 25-30 个项目的数组。它们通过各种过滤器进行分类,例如品牌、类型、 Material 、尺寸等。我怎样才能构建一个可搜索的过滤器。我见过的所有过滤器都只在过滤器中包含 filter:query | 。但是我无法让我的数组查询现有的数组。

这是我的数组的样子,仅显示 1 项以缩小大小..

$scope.products = [
{
src: 'images/img/image1.jpg',
name: 'XXX-1A',
brand: 'Brand A',
material: 'dry',
size: '00',
type: 'dry pipe',
color:'red'
}];

过滤函数(为了节省空间,只包含1个):

$scope.brandIncludes = [];

$scope.includeBrand = function(brand) {
var i = $.inArray(brand, $scope.brandIncludes);
if (i > -1) {
$scope.brandIncludes.splice(i, 1);
} else {
$scope.brandIncludes.push(brand);
}
}

$scope.brandFilter = function(products) {
if ($scope.brandIncludes.length > 0) {
if ($.inArray(products.brand, $scope.brandIncludes) < 0)
return;
}

return true;
}

这是我用来从 HTML 中过滤的内容,我使用复选框来选择每个过滤器:

<div class="info" ng-repeat="p in products |  
filter:brandFilter |
filter:materialFilter |
filter:typeFilter |
filter:styleFilter">
</div>

我的搜索栏标记:

  <div class="filtering">
<div class="search-sect">
<input name="dbQuery" type="text" placeholder="Search pieces" class="search-input" ng-model="query"/>
</div>

过滤器的标记之一:

<input type="checkbox" ng-click="includeStyle('adaptor')"/>Adaptor<br>

现在您已经拥有了所有代码,以下是我尝试过的一些似乎运行不正确的事情:

我的尝试:

搜索栏:

  <input type="text" id="query" ng-model="query"/>

过滤器:

<li ng-repeat="p in products | filter:query | orderBy: orderList">

我知道对于一些有 Angular 经验的人来说,这是一项相对容易的任务,但我只是在学习,似乎无法全神贯注于搜索查询。这可能是我忽略的一个简单的解决方案。这是我的第一个 Angular 应用程序,为了了解更多信息,我正在努力咬牙切齿。

感谢所有回复,提前致谢!

根据要求:CodePen

最佳答案

简单的内置 Angular 过滤器不够智能,无法与您的复选框设计配合使用,因此请尝试编写自定义过滤器。您需要将提到的复选框绑定(bind)到范围中的变量,例如brandFilterIsEnabled。请参阅 writing custom filters 的教程。这是一个工作示例。

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

myApp.controller('ctrl', function ($scope) {
$scope.items = [{
name:'foo',
color:'red'
},{
name:'bar',
color:'blue'
},{
name:'baz',
color:'green'
}];

$scope.searchNames = true;
$scope.searchColors = true;

$scope.$watch('searchColors', function(){
$scope.searchKeys = [ $scope.searchNames ? 'name' : null, $scope.searchColors ? 'color' : null ];
});
$scope.$watch('searchNames', function(){
$scope.searchKeys = [ $scope.searchNames ? 'name' : null, $scope.searchColors ? 'color' : null ];
});
});

myApp.filter('advancedSearch', function($filter) {
return function(data, keys, query) {
results = [];
if( !query ){
return data;
} else {

angular.forEach( data, function( obj ){
var matched = false;
angular.forEach( keys, function( key ){
if( obj[key] ){
// match values using angular's built-in filter
if ($filter('filter')([obj[key]], query).length > 0){
// don't add objects to results twice if multiple
// keys have values that match query
if( !matched ) {
results.push(obj);
}
matched = true;
}
}
});
});
}
return results;
};
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<html ng-app="myApp">
<div ng-controller="ctrl">
<input type='checkbox' ng-model='searchNames'>search names</input>
<input type='checkbox' ng-model='searchColors'>search colors</input>
<input type='text' ng-model='query'>search objects</input>
<ul>
<li ng-repeat="item in items | advancedSearch : searchKeys : query">
<span style="color:{{item.color}}">{{item.name}}</span>
</li>
</ul>
</div>
</html>

关于javascript - 使用 AngularJS 通过查询数组来创建即时搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28901142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com