【问题标题】:Skip ng-repeat JSON ordering in Angular JS在 Angular JS 中跳过 ng-repeat JSON 排序
【发布时间】:2013-10-17 17:42:39
【问题描述】:

有人知道我在使用 ng-repeat 时如何完全跳过 JSON 排序(可能以一种轻松的方式)?

例如,我的源 JSON 看起来像这样 -

{
   "title": "Title",
   "description": "Description",
   "moreInfo": "Moreinformation"
}

一旦我在 ng-repeat 中使用它,它就会按字母顺序排列它们。像这样 -

{
   "description": "Description",
   "moreInfo": "Moreinformation",
   "title": "Title"
}

我的 ng-repeat 看起来像这样 -

<div ng-repeat="(key,data) in items">
   <span class="one"> {{key}} </span>
   <span class="two"> {{data}} </span>
</div>

我看到人们拥有一个单独的键数组并使用它们来识别 JSON 对象,最终避免了字母排序。

有没有优雅的方法来做到这一点?

【问题讨论】:

  • @Cherniv 这很有趣。尽管它使用了类似的方法。它看起来很整洁。您可以将其作为答案之一发布吗? (可能是代码)。很确定它会帮助某人,直到 Angular 的人纠正这个问题。
  • 是的,它很有用,贴出来;)

标签: javascript jquery angularjs angularjs-ng-repeat


【解决方案1】:

在 google 群组中找到了很好的解决方法:

    <div ng-repeat="key in notSorted(data)" ng-init="value = data[key]">
         <pre>
               key: {{key}}
               value: {{value}}
         </pre>           
    </div>

在范围内:

    $scope.data = {
        'key4': 'data4',
        'key1': 'data1',
        'key3': 'data3',
        'key2': 'data2',
        'key5': 'data5'
    };

    $scope.notSorted = function(obj){
        if (!obj) {
            return [];
        }
        return Object.keys(obj);
    }

工作:http://jsfiddle.net/DnEXC/

原文:https://groups.google.com/forum/#!topic/angular/N87uqMfwcTs

【讨论】:

  • 伟大而简单的解决方案 +1
  • 生活更安全! @切尔尼夫
  • 这个解决方案打破了智能表分页功能,如果有人在使用它lorenzofox3.github.io/smart-table-website
  • 你是上帝派来的。 +1
  • 请注意,ng-init 仅在初始化时运行一次(将其视为一次性绑定)。因此,如果您的数据值发生更改,则不会反映出来。 (@SebinSimon 我认为这也是它对你不起作用的原因)
【解决方案2】:

这个使用过滤器的答案最适合我。

https://groups.google.com/d/msg/angular/N87uqMfwcTs/EGoY6O2gtzsJ

http://jsfiddle.net/er52h/1/

angular.module('myFilters', [])
  .filter('keys', function() {
    return function(input) {
      if (!input) {
        return [];
      }
      return Object.keys(input);
    }
  });

你可以这样使用:

<div ng-repeat="key in data | keys" ng-init="value = data[key]"></div>

【讨论】:

  • 这是最干净的解决方案。
【解决方案3】:

我正在使用这种方法来覆盖字母顺序:

控制器

$scope.steps = {
    "basic-settings": "Basic Settings",
    "editor": "Editor",
    "preview-and-publish": "Preview & Publish"
};

// NOTE I realise this is a hacky way, but I need to override JS's alphabetical ordering
$scope.stepsKeys = _.keys($scope.steps);

$scope.activeStep = 0;

请注意 _.keys($scope.steps);是 LoDash 替换 Object.keys();

HTML

<ul>
    <li ng-repeat="key in stepsKeys" ng-class="{active : stepsKeys[activeStep] == key}">{{ steps[key] }}</li>
</ul>

【讨论】:

    【解决方案4】:

    目前没有优雅的方式来做到这一点。原因是 - ngRepeat 创建了一个关联数组,它被称为而不是 JSON 本身。尽管 ECMAScript 标准提到:

    必须保留对象属性的声明顺序,并且迭代必须以相同的顺序发生。

    但不知何故,Angular 的人忽略了它。这可能会在以后的版本中得到纠正。

    我仍然认为 Angular 的行为更有意义。由于对象通常比数组具有更多的初始化逻辑,我认为可以公平地假设顺序通常可能不是用户实际想要/期望的,因此强制特定排序确保正确的行为 - 特别是当我们还必须处理时使用旧版浏览器。

    【讨论】:

    • 我同意和不同意。我同意这样一个事实,即期望对象的顺序不是一个很好的方法。但是 Angular JS 是一个很棒的框架,人们会期望有一个优雅的解决方案(或至少一个解决方案)来解决这个问题。我不确定对象上的序数会如何影响框架的性能,但我认为采用其中一种技巧来解决这个简单的问题并没有什么坏处。所以这个问题没有解决方案是可以的。其实,切尔尼夫发表的评论看起来还不错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多