如何在Javascript / AngularJS中将foo动态设置为等于对象属性名称?

用户名

我正在尝试AngularJS中的一些活动,想知道是否有可能仅使用ng-repeat表示表头,使用ng-repeat表示行,而使用ng-repeat表示行中的字段来动态创建表?

本质上,我想说:“对于对象实例中存在的每个属性,打印一个新的<\ th>,对于myArray中存在的每个对象,打印一个新的<\ tr>,以及每个存在的属性在每个对象的每个实例的每一行中,打印新的<\ td>。

这是我的控制器:

var app=angular.module("app04",[]);

app.controller("Controller1",function(){
  this.name="ABCDEFGH";
  this.objectArray=[{name:"Jane Doe", email:"[email protected]", 
    phoneModel:"LG Optimus S", status:"sad",purchaseDate:"2015-12-01"
  },{name:"John Doe", email:"[email protected]", 
    phoneModel:"iphone 6s", status:"happy",purchaseDate:"2016-12-05"
  }];
})

这是身体:

<body>
  <h1>Hello Angular!</h1>
  <div ng-controller="Controller1 as con1">
    <table>
      <theader>
        <tr>

          <th ng-repeat="object in con1.objectArray[0]">
            {{Object.getOwnPropertyName(object)}}</th>
        </tr>
      </theader>
      <tbody>
        <tr ng-repeat="object in con1.objectArray">
          <td>{{object.name}}</td>
          <td>{{object.email}}</td>
          <td>{{object.phoneModel}}</td>
          <td>{{object.status}}</td>
          <td>{{object.purchaseDate}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>

</html>

由于这是一个非常基础的教程(我只看了第4个视频),所以我被指示写出标题,但是对于重用性来说,尝试一个小的思考挑战并看是否有可能看起来更方便和更好。做类似我上面尝试的事情。

问题在于,Object.getOwnPropertyName和Object.keys似乎无法与此JavaScript一起使用,因此我想知道自己是否做得不正确,或者是否有更好的方法来做到这一点。我还想知道社区中关于在我知道所有对象都将包含相同属性的情况下动态创建所有内容的想法?

斯捷潘诺

您可以这样做的一种方式是这样的:

var app=angular.module("app04",[]);

app.controller("Controller1",["$scope", function($scope){
  this.name="ABCDEFGH";
  this.objectArray=[{name:"Jane Doe", email:"[email protected]", 
    phoneModel:"LG Optimus S", status:"sad",purchaseDate:"2015-12-01"
  },{name:"John Doe", email:"[email protected]", 
    phoneModel:"iphone 6s", status:"happy",purchaseDate:"2016-12-05"
  }];
}]);

<body>
  <h1>Hello Angular!</h1>
  <div ng-controller="Controller1 as con1">
    <table>
      <theader>
        <tr>

          <th ng-repeat="(key,value) in con1.objectArray[0]">
            {{key}}</th>
        </tr>
      </theader>
      <tbody>
        <tr ng-repeat="object in con1.objectArray">
          <td>{{object.name}}</td>
          <td>{{object.email}}</td>
          <td>{{object.phoneModel}}</td>
          <td>{{object.status}}</td>
          <td>{{object.purchaseDate}}</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>

</html>

但是我现在将引用此链接中的ng-repeat文档

JavaScript规范没有定义为对象返回的键的顺序,因此Angular依赖于在myObj中为键运行时浏览器返回的顺序。浏览器通常遵循按定义顺序提供密钥的策略,尽管在删除和恢复密钥后会有例外。有关更多信息,请参阅“删除”上的“ MDN”页面。

这基本上意味着,不能保证标题中的列顺序与您期望的数据列的顺序相同:

   <td>{{object.name}}</td>
   <td>{{object.email}}</td>
   <td>{{object.phoneModel}}</td>
   <td>{{object.status}}</td>
   <td>{{object.purchaseDate}}</td>

例如,如果您这样定义con1.objectArray[0]

{
  email:"[email protected]", 
  name:"Jane Doe", 
  phoneModel:"LG Optimus S", 
  status:"sad",
  purchaseDate:"2015-12-01"
}

在大多数浏览器上,中的列顺序thead将不同于预期的顺序,email第一列将是顺序,然后依次name类推...

但是,如果您知道所有对象都将以相同的顺序定义,并且没有删除属性或执行任何其他可能影响对象中属性顺序的操作,则可以执行以下操作:

<table>
  <theader>
    <tr>
      <th ng-repeat="(key,val) in con1.objectArray[0]">{{key}}</th>
    </tr>
  </theader>
  <tbody>
    <tr ng-repeat="object in con1.objectArray">
      <td ng-repeat="(key,val) in object">{{object[key]}}</td>
    </tr>
  </tbody>
</table>

IMO比第一个示例好,因为只要遵循加粗文本的约束,它将在所有浏览器中都可以使用。

但是最安全的方法是,您可以在数组中的控制器中简单定义列(属性名称),以保证所有浏览器的顺序:

app.controller("Controller1",function(){
  this.name="ABCDEFGH";
  this.objectArray=[{name:"Jane Doe", email:"[email protected]", 
    phoneModel:"LG Optimus S", status:"sad",purchaseDate:"2015-12-01"
  },{name:"John Doe", email:"[email protected]", 
    phoneModel:"iphone 6s", status:"happy",purchaseDate:"2016-12-05"
  },{email:"[email protected]", name:"John Doe",
    phoneModel:"iphone 6s", status:"happy",purchaseDate:"2016-12-05"
  }];
  this.columns = Object.getOwnPropertyNames(this.objectArray[0]); // or you can do it manually with array ['name', 'email', ...]
});

然后用HTML

<div ng-controller="Controller1 as con1">
<table border="1">
  <theader>
    <tr>
      <th ng-repeat="col in con1.columns">{{col}}</th>
    </tr>
  </theader>
  <tbody>
    <tr ng-repeat="object in con1.objectArray">
      <td ng-repeat="col in con1.columns">{{object[col]}}</td>
    </tr>
  </tbody>
</table>
</div>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在JavaScript对象中将数组设置为键值?

如何在Javascript中设置对象的动态属性?

如何在JavaScript中动态设置对象的属性

如何在django中将id标签设置为等于URL名称

如何在JavaScript中给定其字符串名称的对象属性(..的对象属性)设置?

如何在查询中将行号设置为等于列名?

如何动态替换javascript对象属性名称

在angularJS中,如何浏览一个对象中的变量并将它们设置为等于另一个对象的相同名称的变量?

如何将“ Html.SomeHelper”属性值设置为等于模型属性名称?

JavaScript:如何在addEventListener函数中将父对象设置为参数?

如何在JavaScript中将对象的所有值设置为null?

Javascript对象(动态属性名称)

如何在javascript中将json数据设置为变量?

如何在 JavaScript 中将外部函数设置为函数的参数?

如何在javascript中将数组创建为属性?

如何在JavaScript中将多个属性导入对象?

如何在JavaScript中将Math对象的属性暴露给窗口?

如何在JavaScript上使用动态键设置嵌套对象

如何在 JavaScript 中动态获取嵌套对象属性的值?

如何在javascript中替换对象属性名称数组

如何在JavaScript中动态设置if / or条件?

如何在 javascript 对象上设置默认的 __self__ 属性

如何在数据属性中设置javascript日期对象

如何在JavaScript中制作动态对象?

如何在Javascript中动态更新对象?

如何在javascript对象中动态插入?

如何在Javascript对象中引用JSON设置为键

如何在Android中将事件动态设置为本地日历?

如何在C#中将类对象序列化为JSON字符串时动态设置密钥名称