2017-02-19 28 views
1

我對每個項目中的select都有一個ng-repeat。在AngularJS中用數組中的現有值替換對象

用戶可以選擇一個值(觸發一個將對象壓入數組的函數),但是他們也可以改變主意,在這種情況下,代碼只是用新值推動第二個對象,複製第一個對象一。

我怎樣才能設法實際刪除現有的值,只留下每個ng-change的最後一個值?

這裏是我的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); 
} 

然後,您可以在推新一


你也應該清理您的編碼風格:不要混用法國和英文,並使用camelCasesnake_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>