【问题标题】:Add controls to ng-repeat to filter data向 ng-repeat 添加控件以过滤数据
【发布时间】:2016-01-04 01:42:16
【问题描述】:

我有一些使用 ng-repeat 输出的 json 数据,并且我添加了一些表单控件来过滤来自另一个 json 的数据输出。

简化示例

第一个 JSON 数据:

var technologies = [
  {"id":"5", "slug":"mysql", "label":"MySQL", "category":"database"},
  {"id":"4", "slug":"html", "label":"HTML", "category":"markup"}
]

和输出:

<ul>
  <li ng-repeat="tech in technologies">
    <span>{{tech.label}}</span> 
    <span><label>required expertise 
      <select>
        <option>1</option>
        <option>2</option>
        <option>3</option>
        <option>4</option>
        <option>5</option>
      </select></label>
    </span>
  </li>
</ul>

(实际上,此时技术已经从用户在不同页面上做出的另一个选择中过滤掉了,但我认为这没有区别)

第二个 json 包含我想用作过滤器的专业知识属性

var people = [
{
  'label': 'MySQL',
  'slug': 'mysql',
  'talents':[
    {
      'name': 'Stanislav Lem',
      'expertise': 5,
      'desire': 0,
      'last_used': '2009-01'
    },
    {
      'name': 'Ijon Tichy',
      'expertise': 1,
      'desire': 5,
      'last_used': '2011-06'
    }
  ]
},  ...
]

...现在只是简单地用作

<ul>
  <li ng-repeat="item in people">
    {{item.label}}<br>
    <ul>
      <li ng-repeat="person in item.talents">{{person.name}} &middot; Expertise: {{person.expertise}}</li>
    </ul>
  </li>
</ul>

我需要的是一个过滤器,它使用第一个输出中的选项来过滤第二个输出。例如,当 MySQL 所需的专业知识设置为“2”时,将仅显示 Stanislav Lem。实际上,如果没有人符合专业知识,我还需要一条“未找到结果”消息,但我想我可以自己解决这个问题。

Plunker 示例在这里:http://plnkr.co/edit/B0aQp9aCJ2g4OM6fZ3qe?p=preview

【问题讨论】:

  • 这听起来更像是一个规范,而不是对合法代码问题的帮助。应该展示你尝试过的东西,或者看起来你是在要求别人为你做你的工作

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


【解决方案1】:

工作Plunker:http://plnkr.co/edit/jcb6SfKVPkwt7FFCZFHX?p=preview

您需要做的第一件事是将ng-model 属性添加到select。我已将此作为技术属性添加,以便您轻松找到它。

<select ng-model="tech.required">

接下来,我在控制器中添加了以下两个函数来帮助过滤第二个列表:

$scope.getFilterForSlug = function(slug) {
    var technology = getTechBySlug(slug);

    return function(person) {
        return person.expertise >= (technology.required || 0);
    }
}

function getTechBySlug(slug) {
    return _.find($scope.technologies, {
        slug: slug
    });
}

正如名称所述,我在 getTechBySlug 中使用 lodash,以根据 slug 获取正确的技术对象。使用它,getFilterForSlug 返回一个函数,该函数将个人的专业水平与来自select 的所需水平进行比较。如果未选择某个选项,则所需级别设置为 0。

最后,在 HTML 中,我添加了以下内容:

<ul>
    <li ng-repeat="person in filteredPeople = (item.talents | filter: getFilterForSlug(item.slug))">{{person.name}} · Expertise: {{person.expertise}}</li>
</ul>
<span ng-if='!filteredPeople.length'>No Results!</span>

此代码根据当前 slug 获取过滤器,然后过滤使用该功能的人。它将结果存储在一个变量filteredPeople 中,该变量在span 中用于在没有结果时显示一条消息。

【讨论】:

  • 这是一个很好的答案,谢谢。我希望它不需要另一个库,但它又是非常“苗条”的。
猜你喜欢
  • 2017-06-24
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多