【问题标题】:AngularJS Select from Json (similiar to MySQL)AngularJS 从 Json 中选择(类似于 MySQL)
【发布时间】:2016-11-21 07:18:53
【问题描述】:

我有一个 json:

{"sectionTitle":"Account Information","sectionItems":[{"itemTitle":"Balance","url":"/account/balance","selected":true},{"itemTitle":"Account Statement","url":"/account/statementsearch","selected":false},{"itemTitle":"Deposit","url":"/account/deposit","selected":false},{"itemTitle":"Withdrawal","url":"/account/withdraw","selected":false},{"itemTitle":"Edit Profile","url":"/account/editprofile","selected":false},{"itemTitle":"Change Password","url":"/account/changepassword","selected":false}]}

现在我只想检查 sectionTitle 中是否有一个项(子项),其中 selected 为 true。

SQL 中的类似内容

SELECT * FROM sectionItems WHERE selected=true

我可以在angular js中做类似的事情,这样我就可以检查父母是否有孩子?

希望你能理解我的问题。

这是我的html

            <nav class="sidebar-nav">
                    <ul class="nav metismenu" id="side-menu-help">

                        <li ng-repeat="menuItem in accountCtrl.menuStructure">
                            <a class="{{ (menuItem.sectionItems.length > 0) ?  'metisHasChildren' : '' }}" href="/en/help-area/poker-help/poker-rules/">
                                <span ng-if="menuItem.sectionItems.length > 0" class="fa arrow fa fa-angle-double-down"></span>
                                {{ ::menuItem.sectionTitle }}
                                {{ ::menuItem }}
                                </a>
                                <ul class="nav nav-second-level collapse in">
                                    <li ng-repeat="subMenuItem in menuItem.sectionItems" ng-click="accountCtrl.changePage(subMenuItem.url)">
                                        <a ng-class="(subMenuItem.selected) ? 'page-active' : ''">{{ ::subMenuItem.itemTitle }}</a>
                                    </li>
                                </ul>
                        </li>


                    </ul>
                </nav>

【问题讨论】:

  • 你可以使用 Linq 查询
  • 在不安装任何额外库的情况下还有其他方法吗?
  • 我认为你不需要额外的库来使用 Linq
  • 试试var result = JSONstr.where({ selected: true });
  • 试试这个data.sectionItems.filter(function(x){ return x.selected;}).length;

标签: javascript mysql angularjs json


【解决方案1】:

你不需要任何花哨的东西来让它工作。只需将 json 转换为对象并使用点表示法访问所需的属性。比如:

var json          = JSON.parse(json);
var selectedItems = [];

angular.forEach(json.sectionItems, function(sectionItem) {
    if (sectionItem.selected) {
        selectedItems.push(sectionItem);
    }
});

将 json 字符串转换为对象,然后遍历每个 sectionItem 子级,检查 selected 是否为真并创建匹配项数组。

【讨论】:

  • 我需要检查 sectionItems 的长度,其中 selected 是真的
  • 更新了只选择真实项目的答案。您需要使用 for 循环。
【解决方案2】:

您可以使用 forEach 循环。这个例子将返回一个所有 sectionItems 的数组,其中 selected 等于 true,但你可以返回任何你想要的。

$scope.items =[];
angular.forEach(sectionItems, function(item){
  if (item.selected === true){
    $scope.items.push(item);
  }
})

更新

这是一个有效的plunk

要使这项工作与 ng-repeat 内联,您将在过滤器中使用它,如下所示:

app.filter('menuFilter', function() {

  return function(menuItems) {
    var filtered = [];

    angular.forEach(menuItems, function(menuItem) {
      angular.forEach(menuItem.sectionItems, function(item) {
        if (item.selected === true) {
          filtered.push(menuItem);
        }
      });
    });

    return filtered;
  }
});

然后更改您的标记,如下所示:

ng-repeat="menuItem in accountCtrl.menuStructure | menuFilter "

【讨论】:

  • 不错,但是可以在 html 中内联吗?
  • 是的,但具体是什么 HTML?您使用的是 ng-repeat、ng-options 还是其他什么?
  • 我有一个metis菜单,我必须检查里面是否有选择的子菜单,如果有选择,则会将特定的类添加到父级。
  • 好的,你能在你的问题中包含那个 html 吗?
  • 我已经添加了 HTML,我必须将选择的类添加到父级
【解决方案3】:

首先,您不需要做任何自定义过滤器或类似的东西,只需使用标准 过滤器,如下所示:

<li ng-repeat="menuItem in accountCtrl.menuStructure | filter: { sectionItems: { selected: true } }"> {{ menuItem.sectionTitle }}

工作 演示

angular.module('app', [])
  .controller('accountController', function() {
    var vm = this;
  
    vm.menuStructure = [  
       {  
          "sectionTitle":"Account Information",
          "sectionItems":[  
             {  
                "itemTitle":"Balance",
                "url":"/account/balance",
                "selected":true
             },
             {  
                "itemTitle":"Account Statement",
                "url":"/account/statementsearch",
                "selected":false
             },
             {  
                "itemTitle":"Deposit",
                "url":"/account/deposit",
                "selected":false
             },
             {  
                "itemTitle":"Withdrawal",
                "url":"/account/withdraw",
                "selected":false
             },
             {  
                "itemTitle":"Edit Profile",
                "url":"/account/editprofile",
                "selected":false
             },
             {  
                "itemTitle":"Change Password",
                "url":"/account/changepassword",
                "selected":false
             }
          ]
       },
       {  
          "sectionTitle":"Account Information 2",
          "sectionItems":[  
             {  
                "itemTitle":"Balance",
                "url":"/account/balance",
                "selected":false
             },
             {  
                "itemTitle":"Account Statement",
                "url":"/account/statementsearch",
                "selected":false
             },
             {  
                "itemTitle":"Deposit",
                "url":"/account/deposit",
                "selected":false
             },
             {  
                "itemTitle":"Withdrawal",
                "url":"/account/withdraw",
                "selected":false
             },
             {  
                "itemTitle":"Edit Profile",
                "url":"/account/editprofile",
                "selected":false
             },
             {  
                "itemTitle":"Change Password",
                "url":"/account/changepassword",
                "selected":false
             }
          ]
       }
    ];
  });
<!DOCTYPE html>
<html ng-app="app">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.7/angular.min.js"></script>
</head>

<body ng-controller="accountController as accountCtrl">
  <ul>
    <li ng-repeat="menuItem in accountCtrl.menuStructure | filter: { sectionItems: { selected: true } }"> {{ menuItem.sectionTitle }}
      <ul class="nav nav-second-level collapse in">
        <li ng-repeat="subMenuItem in menuItem.sectionItems" ng-click="accountCtrl.changePage(subMenuItem.url)">
          <a ng-class="{ 'page-active': subMenuItem.selected }" ng-bind="::subMenuItem.itemTitle"></a>
        </li>
      </ul>
    </li>
  </ul>
</body>

</html>

提示:

  1. 不用ngClassternary 运算符,您可以简单地使用这种方式:
ng-class="{ 'page-active': subMenuItem.selected }"
  1. 即使您正在使用这种方式工作,我还是建议您查看special-repeats,它非常适合您的情况。

希望对你有帮助!!

【讨论】:

    【解决方案4】:
    var JSONStr=[{"sectionTitle":"Account Information","sectionItems":[{"itemTitle":"Balance","url":"/account/balance","selected":true},{"itemTitle":"Account Statement","url":"/account/statementsearch","selected":false},{"itemTitle":"Deposit","url":"/account/deposit","selected":false},{"itemTitle":"Withdrawal","url":"/account/withdraw","selected":false},{"itemTitle":"Edit Profile","url":"/account/editprofile","selected":false},{"itemTitle":"Change Password","url":"/account/changepassword","selected":false}]}];
    var result = JSONStr.where({ selected: true });
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签