以角度管理相关对象的最佳方法?

时间:2013-05-24 14:54:15

标签: angularjs relational-database

假设我有两个json对象,一个是用户,另一个是帐户,例如:

users = [
  {id: 1, account_id: 1},
  {id: 2, account_id: 2},
  {id: 3, account_id: 1}
]

accounts = [
  {id: 1, name: "administrator"},
  {id: 2, name: "moderator"}
]

所以我必须遍历所有用户数组,并为每个用户获取帐户信息。哪个是管理这些关系以便在标记中访问它们的最佳方法?我找到了以下解决方案:

方法1:只重复一个元素,这样就可以过滤元素并使其在标记的那一部分可用

<div ng-repeat="user in users">
  <div ng-repeat="account in getAccountFromId(user.account_id)">
    <!-- now account is available in all this scope to access user.account.name -->
  </div>
</div>

方法2:更改从后端返回信息的方式,使每个用户的json返回每个json返回的帐户信息。但这将在每个json对象中重复大量信息。这也意味着由于角度的原因而改变了后端。

<div ng-repeat="user in users">
  <!-- with this approach I can access here user.account.name -->
</div>

有人能告诉我这些方法是否正确?有没有更好的方法来管理角度中的对象关系?

非常感谢。

2 个答案:

答案 0 :(得分:3)

如果您真的不喜欢改变来自服务器的数据形状的想法,另一种选择是将用户映射到javascript中的帐户。

app.controller("MyController", function($scope) {

  // Pretend that 'users' and 'accounts' here came from an xhr request
  var users = [
    {id: 1, account_id: 1},
    {id: 2, account_id: 2},
    {id: 3, account_id: 1}
  ]

  var accounts = [
    {id: 1, name: "administrator"},
    {id: 2, name: "moderator"}
  ]

  // Map accounts to users
  for(var i=0; i<users.length; i++) {
    for(var j=0; j<accounts.length; j++) {
      if (accounts[j].id === users[i].account_id) {
        users[i].account = accounts[j];
      }
    }
  }


});

答案 1 :(得分:0)

我遇到了同样的问题,并认为进行数据映射不是前端工作 因此,而不是像account_id那样返回:

users = [
  {id: 1, account_id: 1},
  {id: 2, account_id: 2},
  {id: 3, account_id: 1}
]

我使用&#34; account_name&#34;扩展了模型。 (或者对我来说等同于什么)
因此建议的输出

users = [
  {id: 1, account_id: 1, account_name: "administrator"},
  {id: 2, account_id: 2, account_name: "moderator"},
  {id: 3, account_id: 1, account_name: "administrator"}
]

这有点多余,但在UI中让您的生活更轻松,并且在服务器上的成本也不高。