Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 向阵列添加新对象时出现角度阵列重复错误_Angularjs_Angularjs Ng Repeat - Fatal编程技术网

Angularjs 向阵列添加新对象时出现角度阵列重复错误

Angularjs 向阵列添加新对象时出现角度阵列重复错误,angularjs,angularjs-ng-repeat,Angularjs,Angularjs Ng Repeat,我有一个警报系统,用户需要能够创建无限数量的警报,并为每个警报添加无限数量的触发器 例如,用户可能会收到一个名为“当我的汽车价格发生变化时”的警报。他们需要能够为他们想要追随的每一辆车创建一个相同类型的触发器(“价格变化”) 下面是一个精简版本,只处理触发器 -只需按两次Add,您就会看到问题 JS // the array of trigger possibilities $scope.triggerOptions = [ {id : 0, type: 1, action: "Status

我有一个警报系统,用户需要能够创建无限数量的警报,并为每个警报添加无限数量的触发器

例如,用户可能会收到一个名为“当我的汽车价格发生变化时”的警报。他们需要能够为他们想要追随的每一辆车创建一个相同类型的触发器(“价格变化”)

下面是一个精简版本,只处理触发器

-只需按两次
Add
,您就会看到问题

JS

// the array of trigger possibilities
$scope.triggerOptions = [
  {id : 0, type: 1, action: "Status Update For Brand"},
  {id : 1, type: 2, action: "Price Changed for "}
];

// the model for the select element
$scope.selected = $scope.triggerOptions[0];

// this array will hold all the triggers created
$scope.triggers = [];

// add some indexes to the new trigger object, then add it to triggers
$scope.addTrigger = function() {
  var newTrigger = $scope.selected;
  var newID = $scope.triggers.length;
  var alertID = 0; // todo: apply alert id
  newTrigger.triggerID = newID;
  newTrigger.alertID = alertID;
  $scope.triggers.push(newTrigger);
};
HTML

<select ng-options = "option.action for option in triggerOptions track by option.id" ng-model = "selected"></select>
<button ng-click="addTrigger()">Add</button>

<div ng-repeat="trigger in triggers track by triggerID" class="alert-tool-action-box">
  <div ng-show="trigger.type==1">
    <div>{{trigger.action}}</div>
  </div>

  <div ng-show="trigger.type==2">
    <div>{{trigger.action}}</div>
  </div>
</div>
两个触发因素:

[
  {"id":0,"type":1,"action":"Status Update For Brand","triggerID":1,"alertID":0},
  {"id":0,"type":1,"action":"Status Update For Brand","triggerID":1,"alertID":0}
]

我应该能够在添加触发器时看到每个触发器,即使它们与之前的触发器相同。

您的对象数组不能包含重复项(错误:[ngRepeat:dupes]),现在这两个对象相等。这可以通过使用
track by
解决,track by必须是唯一的,因此这里不能使用
triggerID
。如果没有唯一属性可用,则始终可以使用
按$index跟踪(
ng repeat
指令提供)。

您的对象数组不能包含重复项(错误:[ngRepeat:dupes]),现在这两个对象相等。这可以通过使用
track by
解决,track by必须是唯一的,因此这里不能使用
triggerID
。如果没有唯一属性可用,则始终可以使用
按$index跟踪
(由
ng repeat
指令提供)。

  • 您可以重复只显示数组的一个表示对象,因为您按不存在的triggerID进行跟踪(angular应该在$scope上搜索它,每次调用它时返回undefined)。调用triggerID的好方法是trigger.triggerID。因此:

     <div ng-repeat="trigger in triggers" class="alert-tool-action-box">
      ....
    </div>
    
      • 您可以重复只显示数组的一个表示对象,因为您按不存在的triggerID进行跟踪(angular应该在$scope上搜索它,每次调用它时返回undefined)。调用triggerID的好方法是trigger.triggerID。因此:

         <div ng-repeat="trigger in triggers" class="alert-tool-action-box">
          ....
        </div>
        

      关于第二个问题,您总是在推同一个对象,因为您只有一个$scope实例。 要解决此问题,只需克隆(或复制)$scope.selected,如下所示:


      var newTrigger=angular.copy($scope.selected)关于第二个问题,您总是推送同一个对象,因为您只有一个$scope实例。
      要解决此问题,只需克隆(或复制)$scope.selected,如下所示:


      var newTrigger=angular.copy($scope.selected)TL;博士<代码>跟踪依据必须是唯一的,因此
      触发器ID
      不能包含重复项。您可以始终尝试按
      $index
      进行跟踪,也可以完全不使用跟踪方式。但是为什么一开始就有两个相同ID的触发器呢?ID不应该唯一地标识触发器吗;博士<代码>跟踪依据必须是唯一的,因此
      触发器ID
      不能包含重复项。您可以始终尝试按
      $index
      进行跟踪,也可以完全不使用跟踪方式。但是为什么一开始就有两个相同ID的触发器呢?ID不应该唯一地标识触发器吗?triggerID被设置为触发器数组的长度,所以它不是唯一的,对吗?我的意思是每次添加一个对象时,这个数字都会改变。但是感谢
      $index
      的想法,我会尝试一下。triggerID被设置为触发器数组的长度,所以它不会是唯一的,对吗?我的意思是每次添加一个对象时,这个数字都会改变。但是谢谢你的
      $index
      想法,我会试试的。哦,好的。我认为通过将
      selected
      赋值给一个新变量,它就创建了一个新实例。谢谢对于主值,是。不适用于object。好的,我从
      ng repeat
      中删除了
      track by
      ,尽管我不理解您的解释,为什么这样做有效,而triggerID跟踪无效-triggerID需要唯一-它们不是唯一的吗?哦,好的。我认为通过将
      selected
      赋值给一个新变量,它就创建了一个新实例。谢谢对于主值,是。不适用于object。好的,我从
      ng repeat
      中删除了
      track by
      ,尽管我不理解您的解释,为什么这样做有效,而triggerID跟踪无效-triggerID需要唯一-它们不是唯一的吗?这解决了设置triggerID的问题,但是,即使触发器对象中有许多触发器,仍然只显示一个触发器。这解决了设置triggerID的问题,但即使triggers对象中有许多触发器,仍然只显示一个触发器。
      <div ng-repeat="trigger in triggers track by trigger.triggerID class="alert-tool-action-box">
        ....
      </div>
      
       $scope.addTrigger = function() {
         var newTrigger = angular.copy($scope.selected);
         var newID = $scope.triggers.length;
         var alertID = 0; // todo: apply alert id
         newTrigger.triggerID = newID;
         newTrigger.alertID = alertID;
         $scope.triggers.push(newTrigger);
      };