【问题标题】:angularjs filter on nested objectsangularjs过滤嵌套对象
【发布时间】:2014-09-02 22:33:51
【问题描述】:

我对 angularjs 很陌生,所以我不确定我正在尝试做的事情是否正确。基本上我想在我的页面中显示一个嵌套对象和一个过滤器,这样用户可以轻松地在输入上键入关键字并过滤内容,只显示过滤器找到的记录

但是我注意到过滤器获取了整个父对象并且我希望只显示记录,所以使用以下代码,如果我搜索日本,它将显示悉尼、墨尔本和洛杉矶。

Javascript

<script type="text/javascript">
    var demoApp = angular.module('demoApp',['ngSanitize']);
    demoApp.controller('simpleC',['$scope', function ($scope){
        $scope.info = [
        {name: 'Documents',links:  [
                {linkname:'title1',linknamesublink:[
                        {namesublink:'document 1', description: 'Sydney'},
                        {namesublink:'document 2', description: 'Tokyo <b>Japan</b>'}
                        ]},
                {linkname:'title2',linknamesublink:[
                        {namesublink:'document 3', description: 'Melbourne'},
                        {namesublink:'document 4', description: 'Los Angeles'}
                        ]}
                ]},
        {name: 'Video',links:  [
                {linkname:'title1',linknamesublink:[
                        {namesublink:'video 1', description: 'California'},
                        {namesublink:'video 2', description: 'San Francisco <b> USA</b>'}
                        ]},
                {linkname:'title2',linknamesublink:[
                        {namesublink:'video 3', description: 'South America'},
                        {namesublink:'video 4', description: 'Northern <b>Europe</b>'}
                        ]},
                {linkname:'title3',linknamesublink:[
                        {namesublink:'video name 5', description: 'Africa'},
                        {namesublink:'video name 6', description: 'Bangkok <b>Thailand</b>'}
                        ]}
                ]},
        ];
    }]);
</script>

html:

<div class="container" ng-app="demoApp">
    <br /><input type="text" class="form-control" ng-model="search" >           
    <div ng-controller="simpleC">
        <div ng-repeat="i in info | filter:search" >
            {{i.name}}  : 
            <div ng-repeat="link in i.links">
                {{link.linkname}}
                    <div ng-repeat="sublink in link.linknamesublink">
                            {{sublink.namesublink}}: <!--{{sublink.description}}-->
                            <span ng-bind-html="sublink.description"></span>
                    </div>
            </div>
        </div>    
    </div>
</div>  

【问题讨论】:

  • 您是否正在尝试实现自动完成功能?您可以考虑使用此链接上解释的typeahaed 指令:angular-ui.github.io/bootstrap
  • 对于对这个问题投反对票的人(如果回来阅读它),你能否提供一个投反对票的理由,如果它是重复问题或对你来说太简单的问题,请提供一个解决方案。

标签: angularjs angularjs-ng-repeat


【解决方案1】:

按照这个例子

http://www.whatibroke.com/?p=857

您可以在 ng-repeat 中使用 filter 来按属性过滤项目或自己编写过滤器。

作者想通过 searc_postcode 的值来过滤 postcode 属性。所以,他写了 //filter {postcode : search_postcode} //

附言。对不起,我误解了你的问题。

【讨论】:

  • 您好,谢谢您的回复,我试过了,但它不起作用,不知道是不是因为我正在寻找一个嵌套对象?
  • @user668027 是的,它不适用于嵌套属性。也许您应该自己创建一个自定义过滤器。 docs.angularjs.org/tutorial/step_09
【解决方案2】:

编写您自己的过滤器函数。这样,您可以完全控制返回的内容。 https://docs.angularjs.org/api/ng/filter/filter

module.filter('searchfilter', function() {
  return function(searchexpr) {
   var filteredList = ['my', 'filtered', 'result'];//implement yourself
   return filteredList;   
  }; 
});

并在您的标记中使用searchfilter 而不是filter。

或者,尝试使用此处描述的过滤器函数:http://fdietz.github.io/recipes-with-angular-js/common-user-interface-patterns/filtering-and-sorting-a-list.html(据我所知,您没有定义搜索函数,即过滤器表达式的第一个参数)。

【讨论】:

  • 我不确定我是否理解这些示例,因为它们似乎在硬编码他们想要过滤的内容?
  • 确实,该示例对返回值进行了硬编码(小注释给出了提示:-))。您必须推出自己的过滤功能(即循环浏览您的列表并过滤掉所需的项目)。这并不太难,与角度本身无关。
  • 根据我的第二个建议(“Or, ...”),您可以定义一个过滤器函数来决定是否接受该值(示例中的 search 参数是 不是函数),但这不适用于您的数据结构。
【解决方案3】:

修改:

如果您想根据任何字段(例如“名称”)过滤对象,可以使用以下格式

<div ng-repeat="i in info" ng-if="search==i.name">

【讨论】:

  • 嗨,我很难说过滤器将是 html 的第二行:
  • 嗨@user668027,根据您要过滤结果的对象“info”中的哪个字段
  • 我已经更新了答案。如果您需要根据任何其他字段对其进行过滤,请更新。我会尽力帮助
  • 谢谢Pavi,意思是关于描述,即在对象链接名称子链接内,即在对象链接内。但是或者理想情况下也会过滤其他字段。因为它是嵌套的,所以您的选项将类似于:ng-if="search==i.links.linknamesublink.description" ?
  • @user668027 : 您将无法直接访问 i.links.linknamesublink 因为“链接”是一个数组
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 2020-07-28
  • 2017-03-08
相关资源
最近更新 更多