更改动态值时复制数组对象

时间:2018-07-04 08:05:01

标签: javascript angularjs json

我制作了小型营销应用程序,用户可以在其中选择用于投放广告的屏幕。 接下来是流程,用户选择日期范围,并从API获取具有可用展示次数的所有免费屏幕。用户选择屏幕并将其添加到购物车。每个屏幕都包含具有可用印象的数据。

这是购物车表

 |ID   | Available impressions (input) |
 |1000 |       5000                    |
 |1004 |       7855                    |
 |1098 |       9688                    |
 |1111 |       1022                    |
 total: 23565 (input field)

这像我期望的那样工作,这没关系,我将其发布到API后一切正常。

代码:

<table>
   <thead>
       <tr>
          <th>Id</th>
          <th>Available impressions</th>
       </tr>
   </thead>
   <tboda>
       <tr ng-repeat="item in myCartItems | unique: 'id'">
          <td>item.id</td>
          <td><input type="number" ng-model="item.available_imp" ng-blur="sendCustomSelectedImpressions(item.id, item.available_imp)" ng-max="item.available_imp"</td>
       </tr>
   </tbody>
 </table>

然后我将这些数据推送到数组

$scope.sendCustomSelectedImpressions = function(id, numberOfImpressions){
      $scope.myCartItems.push({
        'id': id,
        'campaignImpressions': numberOfImpressions
      });
}

问题1

问题是如果我们在印象中连续输入新值,并且在发送到API之前,再次输入新值,那么在json中,我不会只获得新值,而是会获得之前输入的所有值,就像在JSON中一样波纹管

{"campaign_items": [
{"id": 1000, "impressions": 5000},//duplicate, this is initial, i don't need this, i need new
{"id": 1004, "impressions": 7855},
{"id": 1098, "impressions": 9688},
{"id": 1111, "impressions": 1022},
{"id": 1000, "impressions": 6000}, //duplicate, when i try to input another number
{"id": 1000, "impressions": 4561}, //i only need this last i entered
]}

如何仅获取我在提交之前输入的输入,而之前没有所有输入,没有重复?

问题2

对于这个问题,我仍然没有任何代码,因为我需要这样做,但是我需要逻辑方面的帮助。

如果看表示例,您将看到TOTAL也为输入字段。 加载ng-table后,我会连续汇总所有展示并显示总计。没关系。 每个屏幕都有一个不同的最大总数,例如,如果我在总数字段中输入另一个数字,而不是23565,则输入较低的数字19000,我需要平均添加到所有选定的屏幕中。这里的问题是,具有ID 1111的屏幕仅具有1022的印象,但是具有ID 9688的屏幕具有9688的印象。 对我来说,解决方案是计算更改初始sum数量的百分比,当我得到结果时,每屏印象减少相同的百分比。如果有人有其他解决方案,或者对代码有任何想法,请与我们分享。

再次感谢

2 个答案:

答案 0 :(得分:2)

对于第一个问题,可以在推送新数据之前删除具有该ID的对象。假设您可以使用filter函数(否则需要循环)。这样,您将删除要在下一个push语句中推送的ID。

$scope.sendCustomSelectedImpressions = function(id, numberOfImpressions){
      $scope.myCartItems = $scope.myCartItems.filter(item => item.id !== id);

      $scope.myCartItems.push({
        'id': id,
        'campaignImpressions': numberOfImpressions
      });
}

答案 1 :(得分:0)

我认为对于问题1 ,您可能不需要推送新值,而只需更新$ scope.myCartItems。

$scope.sendCustomSelectedImpressions (id, numberOfImpressions) {
    if (!numberOfImpressions) return; // Check, if input is not empty (not undegined or null)
    $scope.myCartItems[id - 1].impressions = numberOfImpressions; // change existing object items
};

我用示例(Angularjs + ES6)制作了一个简单的stackbltz应用程序。希望对您有所帮助:)

https://stackblitz.com/edit/angularjs-tn1zs9?embed=1&file=home/home.controller.js