首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将控件添加到ng-重复以筛选数据。

将控件添加到ng-重复以筛选数据。
EN

Stack Overflow用户
提问于 2015-10-07 00:23:21
回答 1查看 86关注 0票数 3

我有一些用ng重复输出的json数据,我还添加了一些表单控件来过滤来自另一个json的数据输出。

简化样本

第一个JSON数据:

代码语言:javascript
复制
var technologies = [
  {"id":"5", "slug":"mysql", "label":"MySQL", "category":"database"},
  {"id":"4", "slug":"html", "label":"HTML", "category":"markup"}
]

以及产出:

代码语言:javascript
复制
<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包含我想要用作筛选器的专门知识属性。

代码语言:javascript
复制
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'
    }
  ]
},  ...
]

...and,它现在被简单地用作

代码语言:javascript
复制
<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。事实上,如果没有人和我的专业知识相匹配,我也需要一个“没有发现的结果”的信息,但我想我可以自己解决这个问题。

柱塞样品在这里:http://plnkr.co/edit/B0aQp9aCJ2g4OM6fZ3qe?p=preview

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-07 00:53:52

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

您需要做的第一件事是向ng-model添加一个select属性。我把它作为这项技术的一个属性,这样你就可以很容易地找到它。

代码语言:javascript
复制
<select ng-model="tech.required">

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

代码语言:javascript
复制
$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,作为名称声明,以获得基于段塞的正确的技术对象。使用该方法,getFilterForSlug返回一个函数,该函数将个人的专业知识水平与select所期望的级别进行比较。如果没有选择一个选项,那么所需的级别将设置为0。

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

代码语言:javascript
复制
<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>

这段代码根据当前的段塞获取一个过滤器,然后使用该函数对用户进行过滤。它将结果存储在变量filteredPeople中,该变量用于在没有结果时显示消息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32981829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档