ChatGPT解决这个技术问题 Extra ChatGPT

如何在 AngularJS 中使用 ng-repeat 迭代键和值?

在我的控制器中,我有如下数据:$scope.object = data

现在,此数据是包含来自 json 的键和值的字典。

我可以在模板中使用 object.name 访问该属性。有什么方法可以让我也可以遍历键并将它们显示在表格中

<tr><td> {{key}} </td> <td> data.key </td>

数据是这样的

{
    "id": 2,
    "project": "wewe2012",
    "date": "2013-02-26",
    "description": "ewew",
    "eet_no": "ewew",
}

h
huan feng

怎么样:

<table>
  <tr ng-repeat="(key, value) in data">
    <td> {{key}} </td> <td> {{ value }} </td>
  </tr>
</table>

此方法在文档中列出:https://docs.angularjs.org/api/ng/directive/ngRepeat


它应该可以工作:plnkr.co/edit/7AQF6k7hf2aZbWFmhVoX?p=preview。你能修改它直到它停止工作吗?
它就像一个魅力。唯一的问题是它将按字母顺序排列,因此如果项目顺序与显示相关,则命名很重要。
@IsabelHM 出于多种原因,我们中的很多人都建议不要迭代 ngRepeat 中的对象。事实上,我曾经听说过一个核心团队成员后悔曾经实现过这样做的能力!通常最好将控制器中的对象转换为数组;这使意图更加清晰,并降低了在某些情况下出现奇怪/不可预测行为的风险。您可以按照通常的方式进行排序。 :-)
正如 IsabelHM 所说,输出按名称的字母顺序排列。有没有办法强迫它不这样做?
@sethflowers 正如我在之前的评论中提到的,我不建议迭代对象中的键。最好将其转换为控制器中的数组。假设没有基于您的业务模型的惯用方式来执行此操作,ES6 使其变得非常简单:Object.getOwnPropertyNames(data).map(k => ({key:k, value:data[k]));
R
Ricky Nelson

如果您想使用两种方式绑定来编辑属性值:

<tr ng-repeat="(key, value) in data">
    <td>{{key}}<input type="text" ng-model="data[key]"></td>
</tr>

谢谢!出于好奇,您是否在某个地方的文档中找到了这种技术?我徒劳地搜索,直到在这里找到你的答案。
@cbk:这就是我要找的……谢谢
非常感谢,你拯救了我的一天:)
@cbk 这与使用 ng-model="value" 不一样吗?
@MikeHarrison ng-repeat 本质上是迭代对象并返回键值对。把它想象成 for(var value in arrayOfValues) { ... }。如果您在循环中重新分配变量 value,则不会更改 arrayOfValues 内部的内容,而只是将 value 重新指向一个新对象。
F
Felipe Castro

我认为 Angular 中没有内置函数可以执行此操作,但是您可以通过创建一个包含所有标题名称的单独范围属性来执行此操作,并且您可以像这样自动填充此属性:

var data = {
  foo: 'a',
  bar: 'b'
};

$scope.objectHeaders = [];

for ( property in data ) {
  $scope.objectHeaders.push(property); 
}

// Output: [ 'foo', 'bar' ]

如果需要遍历角度控制器内的数据(OP 要求查看循环),您的答案就可以正常工作。
u
user3414423

我们可以按照以下步骤来避免按字母顺序显示键值。

Javascript

$scope.data = {
   "id": 2,
   "project": "wewe2012",
   "date": "2013-02-26",
   "description": "ewew",
   "eet_no": "ewew",
};
var array = [];
for(var key in $scope.data){
    var test = {};
    test[key]=$scope.data[key];
    array.push(test);
}
$scope.data = array;

HTML

<p ng-repeat="obj in data">
   <font ng-repeat="(key, value) in obj">
      {{key}} : {{value}}
   </font>
</p>

不允许重复关键字
M
Mosh Feu

todo 列表 示例,它通过 ng-repeat 循环对象:

var app = angular.module('toDolistApp', []); app.controller('toDoListCntrl', function() { var self = this; self.toDoListItems = {};// []; //如果键是字符串而不是数字,则不要使用方括号 self.doListCounter = 0; self .addToDoList = function() { var newToDoItem = {}; newToDoItem.title = self.toDoEntry; newToDoItem.completed = false; var keyIs = "key_" + self.doListCounter++; self.toDoListItems[keyIs] = newToDoItem; self.toDoEntry = ""; //添加item后让输入框空白 }; }); app.filter('propsCounter', function() { return function(input) { return Object.keys(input).length; } });

项目总数:{{toDoListCntrlAs.toDoListItems | propsCounter}}
输入待办事项: {{toDoListCntrlAs.toDoEntry}}
{{$index+1}} : {{key }} : 标题 = {{ prop.title}} : 状态 = {{ prop.completed}}


关于不使用方括号的评论真的很有帮助。该更改修复了我的代码。谢谢。
我也是。有人可以解释为什么使用大括号修复了我的代码吗?
A
Ajay Kumar

此处的完整示例:-

<!DOCTYPE html >
<html ng-app="dashboard">
<head>
<title>AngularJS</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<link rel="stylesheet" href="./bootstrap.min.css">
<script src="./bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js"></script>
</head>
<body ng-controller="myController">
    <table border='1'>
        <tr ng-repeat="(key,val) in collValues">
            <td ng-if="!hasChildren(val)">{{key}}</td>  
            <td ng-if="val === 'string'">
                <input type="text" name="{{key}}"></input>
            </td>
            <td ng-if="val === 'number'">
                <input type="number" name="{{key}}"></input>
            </td>
            <td ng-if="hasChildren(val)" td colspan='2'>
                <table border='1' ng-repeat="arrVal in val">
                    <tr ng-repeat="(key,val) in arrVal">
                        <td>{{key}}</td>    
                        <td ng-if="val === 'string'">
                            <input type="text" name="{{key}}"></input>
                        </td>
                        <td ng-if="val === 'number'">
                            <input type="number" name="{{key}}"></input>
                        </td>
                    </tr>
                </table>                
            </td>

        </tr>       
    </table>
</body>

<script type="text/javascript">

    var app = angular.module("dashboard",[]);
    app.controller("myController",function($scope){
        $scope.collValues = {
            'name':'string',
            'id':'string',
            'phone':'number',
            'depart':[
                    {
                        'depart':'string',
                        'name':'string' 
                    }
            ]   
        };

        $scope.hasChildren = function(bigL1) {
            return angular.isArray(bigL1);
} 
    });
</script>
</html>

C
Chirag Prajapati
    Use below code it is working to display your key and value here is key start with 1:
         <tr ng-repeat="(key,value) in alert_list" >
                   <td>{{key +1}}</td>
                   <td>{{value.title}}</td>
                 </tr>
Below is document link for it. 

https://docs.angularjs.org/api/ng/directive/ngRepeat


A
Alireza

你可以在你的javascript(控制器)或你的html(角度视图)中做到这一点......

js:

$scope.arr = [];
for ( p in data ) {
  $scope.arr.push(p); 
}

html:

<tr ng-repeat="(k, v) in data">
    <td>{{k}}<input type="text" ng-model="data[k]"></td>
</tr>

我相信 html 方式更具角度,但您也可以在控制器中执行并在您的 html 中检索它...

查看对象键也不是一个坏主意,如果您需要它们,它们会为您提供键的数组,更多信息在这里:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys