javascript - 如何为对象制作过滤器?

标签 javascript angularjs

请帮助修复脚本。

PLUNKER

我制作新闻源。数据存储在 json 文件中。我以重复方式输出数据项。

html:

<input class="filter" type="text" ng-model="searchPhrase" placeholder="Фильтр по заголовку">

<div class="news-list" ng-if="!detailsShow">
<h2 class="md-display-1 ng-binding">список чего-то из json-файла</h2>
<input class="filter" type="text" ng-model="searchPhrase" placeholder="Фильтр по заголовку">

<ul class="news-list-inner">
  <li class="news-item" ng-repeat="(key, val) in news | filter:searchPhrase" ng-click="openDetails(key)">
    <div class="poster" style="background-image: url('{{newsImagesStoragepath}}{{val.poster}}');"></div>
    <div class="title">{{val.title}}</div>
    <div class="description">{{val.description | cutText:100}}</div>
  </li>
</ul>
</div>

Angular Controller :

function($rootScope, $scope, $timeout, $http) {
$scope.newsImagesStoragepath = '/';
$scope.detailsShow = false;

$scope.getNews = function() {
  $http.get('news.json')
    .then(function successCallback(resp){
      $scope.news = resp.data.values;
    }, function errorCallback(resp) {
      console.log('error', resp);
    });
};

$scope.getNews();
}

json(片段):

{
  "headers": {
    "title":{"title":"Заголовок","type":"text"},
    "description":{"title":"Описание","type":"text"},
    "poster":{"title":"Изображение","type":"file"}
  },
  "values":{
    "id1": {"title":"Lorem ipsum dolor sit.", "poster": "1.jpg", "description": "Lorem ipsum dolor sit amet, re."},
    "id2": {"title":"Sequi alias, cumque at.", "poster": "3.jpg", "description": "Architecto, placeat! C"},

我需要按标题的短语添加过滤器。但控制台显示以下错误消息:

angular.js:13920 Error: [filter:notarray] Expected array but received:

最佳答案

angular.js:13920 Error: [filter:notarray] Expected array but received:

当过滤器未与数组一起使用时,会发生此错误。 要按对象的属性值过滤对象,您可以创建自己的自定义过滤器。

根据您的情况,您可以像这样创建过滤器:

JS:

.filter('custom', function() {
  return function(input, search) {
    console.log(input, search);
    if (!input) return input;
    if (!search) return input;
    var expected = ('' + search).toLowerCase();
    var result = {};
    angular.forEach(input, function(value, key) {
      console.log(value);
      var actual = ('' + value.title).toLowerCase();
      if (actual.indexOf(expected) !== -1) {
        result[key] = value;
      }
    });
    return result;
  }
});

HTML:

ng-repeat="(key, val) in news |custom:searchPhrase"

此过滤器将根据您的要求按短语过滤标题。 Plunker Link (我对你的代码做了一些更改)

关于javascript - 如何为对象制作过滤器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40173590/

相关文章:

angularjs - 通过 `params` 嵌入 View ui-router

javascript - 如何在多个 Controller 中使用相同的数据?

javascript - 数据表行详细信息中的隐藏/显示按钮

javascript - AngularJS基于单选按钮与文本框结合的过滤表

javascript - Mvc 管理上下文和可重用组件

javascript - 隐藏类以及 {} 对象与自定义构造函数之间的等效性 (v8)

angularjs - 提供者依赖注入(inject) & uglify 特殊情况

angularjs - ui.bootstrap.tpls 覆盖 template/datepicker/popup.html 模板

javascript math.round 和 math.floor 在 IE 和 Opera 中工作正常,但在 Chrome、Safari 或 Firefox 中不行。得到 NaN

javascript - 将悬停自定义导航栏转换为单击