2013-08-18 20 views
12

Utilizzando AngularJS, sto creando una funzione addTodo nella mia app.Verifica l'unicità nella matrice, push alla matrice se univoca

Sembra che si stia riscontrando problemi nell'implementazione di un modo per verificare l'univocità dell'oggetto che viene aggiunto all'array e di averlo seguito da azioni aggiuntive.

Finora sono in grado di eseguire le azioni aggiuntive, ma non il controllo iniziale dell'unicità. Come posso implementare la verifica dell'azione di unicità e poi farla seguire dalle azioni aggiuntive?

La funzione addTodo che sto cercando di creare flussi di simile (Bold significa non implementato):

  1. Controllare se todo è già in todos

    1a . Se non exisit, non spingere, visualizzare avviso

  2. Controllare se todo non è vuoto

    2a. Se è vuota, non spingere, visualizzare avviso

  3. se unica e non vuoto, spingere a todos, la visualizzazione dei messaggi di successo

funzione addTodo attuale (senza controllo unqiueness):

$scope.addTodo = function(){ 
    $scope.isVisible = true; 
    if ($scope.todo) { 
    $scope.todos.push($scope.todo); 
    $scope.todo = ''; 
    $scope.alert = $scope.alerts[1]; 
    }else{ 
    $scope.alert = $scope.alerts[0]; 
    } 
}; 

Nota 1: $scope.alert e $scope.alerts vengono utilizzati per visualizzare determinati messaggi di errore;

$scope.alerts[0] 

"Si prega di aggiungere del testo al compito."

$scope.alerts[1] 

"Aggiunto un nuovo compito!"

L'avviso voglio visualizzare se l'attività che si aggiunge già esiste è

$scope.alerts[3] 

"Task già in lista."

Nota 2: $scope.isVisible commuta la visibilità della segnalazione

+0

Quindi 'todo' è una stringa o un oggetto semplice? – Chandermani

+0

È una semplice stringa, sì –

+0

Spero tu abbia controllato la mia risposta allora. – Chandermani

risposta

18

uso Array.indexOf questo modo:

$scope.addTodo = function(){ 
    $scope.isVisible = true; 
    if ($scope.todo) { 
    if ($scope.todos.indexOf($scope.todo) == -1) { 
     $scope.todos.push($scope.todo); 
     $scope.todo = ''; 
     $scope.alert = $scope.alerts[1]; 
    }else{ 
    // $scope.todo is already in the $scope.todos array, alert the user 
     $scope.alert = $scope.alerts[3]; 
    } 
    }else{ 
    $scope.alert = $scope.alerts[0]; 
    } 
}; 
+0

Fantastico, grazie! Risolto il mio problema principale di non essere sicuro di dove nel flusso implementare l'azione e come implementarla correttamente in base a ciò che avevo già. –

+0

_Nota per gli altri: _ il flusso di mef differisce dal flusso che ho stabilito sopra, ma in realtà è il modo corretto di guardarlo: in primo luogo, controlla se il todo è vuoto. In caso contrario, controllare se è unico. La mia trappola nel codice qui sotto era che ero troppo attaccato all'idea che dovevo controllare se il todo fosse unico prima di controllare se fosse vuoto. –

0

Se si utilizza una stringa standard todo è possibile utilizzare il metodo di matrice indexOf javascript. Questo metodo per i tipi di dati dell'oggetto fa una corrispondenza di riferimento.

Altrimenti si può anche guardare al metodo jquery grep.

Utilizzare uno di questi metodi per verificare se $scope.todos contiene già tale elemento e visualizzare l'avviso.

+0

In base a ciò, ho modificato il codice in questo modo, ma è ancora possibile che i duplicati vengano inviati all'array; '$ scope.addTodo = function() { $ scope.isVisible = true; var todos = $ scope.todos; var todo = $ scope.todo; if (todo == todos.indexOf (todo)) { $ scope.alert = $ scope.alerts [3]; } else if ($ scope.todo) { $ scope.todos.push ($ scope.todo); $ scope.todo = ''; $ scope.alert = $ scope.alerts [1]; } else { $ scope.alert = $ scope.alerts [0]; } }; ' –

1

se si utilizza underscore O lodash, è possibile utilizzare questo semplice codice di spingere oggetti unici in array.

if (_.findWhere($scope.todos, $scope.todo) == null) { 
    $scope.todos.push($scope.todo); 
} 

Spero che questo aiuti !!!

Problemi correlati