【问题标题】:Angular JS : updating object values in scope after the backend callAngular JS:在后端调用后更新范围内的对象值
【发布时间】:2014-02-13 10:10:38
【问题描述】:

我有一个带有 HTML 表格的 Angular js html 页面。这有大约 100 行。用户选择 10 或 15 行并进行后端调用。后端调用是使用 $.ajax({...}) 进行处理和更新数据库。处理后,后端返回 2 或 3 条记录返回屏幕。这些返回的对象将具有新的状态和一些新的值。所以我需要将这些状态同步回我范围内的同一个对象,以便它们反映在屏幕上。

我知道我们可以遍历每个对象并更新状态。但由于数据量太大(有时甚至 1000 行),我想知道 Angular 中是否有任何现成的功能可以完成这项工作。如果 Angular 中没有这样的功能,请推荐任何其他可以为我提供帮助的免费开源工具。

我在这里附上代码 sn-p。只是出于保密的原因,我将我的问题转换为客户帐户场景

<table >
     <thead >
       <tr>  
     <th >Customer Name</th>
     <th >Account Number</th>
     <th >Status </th>
     <th >Date</th>                 
       </tr>
    </thead>
    <tbody  ng-repeat="customer in customerList">
       <tr  ng-repeat="account in customer.accounts"  >
    <td>{{customer.name}}</td>
    <td>{{account.acctNum}}</td>
    <td>
         <input type="checkbox"  ng-model="account.acctId"  ng-change="selectThisAccount(account)" /> {{account.status}}
    </td>
    <td>{{account.activationTimestamp}}</td>
       </tr>
    </tbody>
</table>
<input  type="button" value="Activate Accounts"   ng-click="activateAccounts()"  />

Controller
===========

$scope.customerList = ....
// I have my customer list retrieved by way of another call and the data is assigned to the scope.customerList variable

$scope.selectedAccounts = [];
$scope.selectThisAccount = function(account) {
      $scope.selectedAccounts.push(account);
};


$scope.activateAccounts = function() {
    $scope.successfullyActivatedAccounts = [];
    $scope.successfullyActivatedAccounts = AccountService.activateAccounts($scope.selectedAccounts);
}

AccountService.js
======================
    this.activateAccounts = function(accounts)
    {

    var accountRequest ={};
    accountRequest.accountList = accounts;

     return $.ajax({
          type : 'POST',
          url: 'activateAccounts',
          data:JSON.stringify(accountRequest),
          dataType: "json",
          contentType: "application/json",
          success: function(accountresponse){
         return accountresponse.accountList;    
          },   
          error : function(xhr, ajaxOptions, thrownError) {
             hideReportMessage();
             alert( "Error: " + xhr.responseText + "\n" + thrownError );
          }
      });  
    },

为了解释这一点,一个客户可以有多个帐户,每个帐户可以处于不同的状态。最终用户将看到客户帐户列表,选择其中的列表并尝试激活帐户。只有那些被激活的账户对象才会被服务器返回。我需要更新 account.status 的值来识别正确的对象,而无需遍历整个列表。

请帮忙。

【问题讨论】:

  • 后端restful服务发送JSON对象。
  • 我无法控制将服务调用从 $.ajax 更改为 $http。这是一个可重用的服务调用,运行良好,我只需要使用它。后端是 spring 控制器,它发送转换为 JSON 的 java 对象列表,表中的每一行都是一个对象。如果您认为我没有正确理解您的问题“这些是什么类型的对象”,请详细说明。
  • 抱歉,如果您展示一些控制器和标记,我们或许可以提供帮助
  • @calebboyd,我已经用代码 sn-p 更新了我的问题,更详细地解释了这个问题。请帮忙。谢谢。
  • Angular 没有说明数据的大小。如果您使用 ng-repeat 超过 1000 行,则可能是性能问题。还有一点是你应该用 $http 调用替换 $.ajax 并使用 Angular Promise

标签: html angularjs html-table sync angularjs-scope


【解决方案1】:

我想使用ng-model 可以自然地解决您的问题。更具体地说,假设您在 Controller 中检索了 1000 行表中的所有数据,并且您已将数据集保存在 Controller 中为 $scope.dataset。然后,当您调用 ajax 更新某些行时,您可以简单地将 ajax 结果更新到您的$scope.dataset(数据)中,然后表(视图)将自行更新。

为了避免遍历$scope.dataset 中的所有 1000 行(当您有 ajax 结果时),为了匹配更新的条目,您还可以简单地添加一个 index服务器端的每个条目的字段(或对所有条目进行排序)。然后您可以使用 index 访问$scope.dataset 中的任何条目。

【讨论】:

  • 你是说 - 如果我对所有元素进行排序并在后端为每一行添加一个索引号并将它们发送到 HTML 页面并加载它,以后可以使用它来定位对象更新?还是您提到的 $index ?
  • 1.似乎 Angular $index 对您的情况没有帮助。 2. 如果您的目的是避免编写代码来查找已更新的条目,您可以使用 Angular filter(通过指定一个或多个匹配字段来定位数据集中的条目)或第 3 方 @987654321 @ 操作您的数据集。 3. 如果您想要完全避免 1000 行的迭代,我能想到的是将数据集从 Array 转换为类似 Map 的结构,由每个条目的唯一数字或字符串 Key 索引 - 但这似乎也是一个迭代操作...
  • 我会尝试你提到的观点,但我刚刚用代码 sn-p 更详细地更新了我的问题。你能看看,看看你能不能给我具体的建议。谢谢。
  • 抱歉再次询问。这里我的数据集是另一个列表中的列表。如上所述,所需的帐户对象存在于客户列表中的 accountList 中。
  • 只要你使用数组,你必须循环通过它来查找一个特定的条目。因此,您可以将其转换为类似 Map 的结构,以便您可以直接访问它(例如 customer['google']['Mike']),或者您可以尝试使用 $filter 或 underscore.js 来定位该条目。
【解决方案2】:

所以这里是plunker。我举了你的例子。并做了一些改动。我使用$timeout 复制$http,因此您可以使用角度承诺。 (.then)在执行完代码后会运行摘要循环。由于引用 ($scope.selectedAccounts) 已更改,ng-repeats 刷新已更改的引用。它非常易于使用 $http 并承诺更新视图。

简而言之, 您会注意到只有successfullyActivatedAccounts 实际激活,因为它们是唯一成功返回的(虚拟数据)。如果您确定返回值的顺序,也可以优化activateAccounts 中的循环。不过总体来说这个表现应该还不错。

我将数据集更新为 plunker 可以处理的最大大小。激活性能仍然非常即时。

【讨论】:

  • 非常感谢。我可以根据您的建议解决问题。
  • 您应该考虑使用$resource 而不是$http 来使用$promise
猜你喜欢
  • 1970-01-01
  • 2014-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多