【问题标题】:AngularJS search array of objectsAngularJS搜索对象数组
【发布时间】:2015-06-03 18:17:42
【问题描述】:

我的控制器中有一个对象数组,例如:

$scope.fields = [
    {fieldName:'houseNum',fieldLabel:'House Number',disabled:false},
    {fieldName:'street',fieldLabel:'Street',disabled:false},
    {fieldName:'city',fieldLabel:'City',disabled:true},
    {fieldName:'state',fieldLabel:'State',disabled:true},
]

在 HTML 中,我希望能够获得 fieldLabel,其中 fieldName=='street'。 AJS 文档假定每个过滤器案例都应该在 ng-repeat 的上下文中 - 但在我的情况下并非如此,因为我只是试图从基于 'fieldName' 的 'fields' 数组中提取一个 'fieldLabel'

例如:HTML

{{ fieldLabel in fields | filter : {fieldName:'street'} : true}}

我怎样才能完成这样的工作 - 还是我需要创建自己的指令并将 $scope.fields 传递给指令并手动循环?

【问题讨论】:

    标签: javascript arrays angularjs filter


    【解决方案1】:

    你可以这样做:

    {{ (fields | filter : {fieldName:"street"} : true)[0].fieldLabel}}
    

    (fields | filter : {fieldName:"street"} : true) 返回一个过滤项数组,获取第一个[0] 并访问该对象的fieldLabel 属性。

    angular.module('app', []).controller('ctrl', function($scope) {
      $scope.fields = [{
        fieldName: 'houseNum',
        fieldLabel: 'House Number',
        disabled: false
      }, {
        fieldName: 'street',
        fieldLabel: 'Street',
        disabled: false
      }, {
        fieldName: 'city',
        fieldLabel: 'City',
        disabled: true
      }, {
        fieldName: 'state',
        fieldLabel: 'State',
        disabled: true
      }, ]
    })
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    <div ng-app="app" ng-controller="ctrl">
      {{ (fields | filter : {fieldName:"street"} : true)[0].fieldLabel}}
    </div>

    虽然更好的选择是从控制器本身设置属性,这样过滤器就不会在每个摘要周期中运行。

    function getFieldByName(prop){
         var field = {};
         //Or just use a for loop and break once you find a match
         $scope.fields.some(function(itm){
             if(itm.fieldName === prop){
                field = itm;
                return true;
             }
         });
         //Or you could inject $filter as well an do as below
         //return $filter('filter')($scope.fields,{fieldName:"street"})[0] || {}
         return field;
    }
    
    //Somewhere
    $scope.streetField = getFieldByName('street');
    

    在视图中:

    {{streetField.fieldLabel}}
    

    Array.some

    【讨论】:

    • 谢谢 - 这很有意义。我没有意识到您可以只为过滤器表达式指定干草堆。
    • @user1583198 可以,但我建议不要在视图中使用过滤器,除非确实需要。在您的情况下,只是为了显示过滤后的静态值,您不妨在控制器中进行。
    猜你喜欢
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    相关资源
    最近更新 更多