2017-02-19 4 views
1

У меня есть ng-repeat с выбором в каждом элементе.Заменить объект существующим значением в массиве в AngularJS

Пользователь может выбрать значение (запуск функции, которая подталкивает объект в массив), но они также могут изменить свое мнение, и в этом случае код просто подталкивает второй объект с новым значением, дублируя первый один.

Как я могу удалить фактические значения, оставив только последнее на каждом ng-изменении?

Вот мой HTML:

<select ng-change="insertproduct(pa.nom, basket)" ng-model="basket"> 
    <option ng-repeat="select in numberofproducts">{{select}}</option> 
</select> 

И мой JavaScript:

$scope.numberofproducts = [1,2,3,4,5,6,7,8,9,10] 

$scope.singleorder = []; 

$scope.insertproduct = function(nom, basket){ 
    $scope.numero = { 
    'producte': nom, 
    'numero': basket 
    }; 
    $scope.singleorder.push($scope.numero); 
    console.log($scope.singleorder); 
} 

Идея заключается в том, чтобы создать условия, в которых, если массив содержит объект с параметром'producte' равен новый, удалите существующий и нажмите новый.

Любые советы?

ответ

0

Сначала используйте метод findIndex, чтобы проверить, находится ли объект с тем же свойством уже в массиве singleorder.

function duplicateOrder(order) { 
    return order.producte === nom; 
} 
var index = $scope.singleorder.findIndex(duplicateOrder); 

Примечание: browser support для findIndex ограничена; он не поддерживается в Internet Explorer.

Затем удалить элемент с splice:

if(index > -1){ 
$scope.singleorder.splice(index, 1); 
} 

Вы можете нажать на новый в


Вы также должны очистить свой стиль кодирования:. не смешивать французский и на английском языке, и используйте либо camelCase, либо snake_case для ваших функций по улучшению r eadability.

0

Наблюдение:

  • Используйте AngularJS ngOptions атрибут вместо ng-repeat.
  • Вы можете проверить index элемента в массиве, если он уже был там, вы можете легко удалить предыдущий.

DEMO

var myApp = angular.module('myApp',[]); 
 

 
myApp.controller('MyCtrl',function($scope) { 
 
    $scope.numberofproducts = [1,2,3,4,5,6,7,8,9,10] 
 

 
    $scope.newArray = []; 
 

 
    $scope.insertproduct = function(basket) { 
 
     var prevIndex = $scope.newArray.indexOf(basket); 
 
     if(prevIndex > -1) { 
 
     $scope.newArray.splice(prevIndex, 1); 
 
     } else { 
 
     $scope.newArray.push(basket); 
 
     } 
 
     console.log($scope.newArray); 
 
    } 
 
    
 
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp" ng-controller="MyCtrl"> 
 
<select ng-change="insertproduct(basket)" ng-model="basket" ng-options="select for select in numberofproducts"> 
 
</select> 
 
</div>

Смежные вопросы