2013-03-03 16 views
8

Ho iniziato a utilizzare lo AngularJS ultimamente e penso di essermi imbattuto in un bug strano.La convalida del modulo non viene aggiornata quando l'articolo viene rimosso dal modello. Bug?


In primo luogo, ecco qualche codice di lavoro:

Vista:

<body ng-controller="MainCtrl"> 

    <form name="form"> 

     <div ng-repeat="phone in phoneNumbers"> 
      <input ng-model="phone.number" required /> 
      <button ng-click="deleteNumber($index)">Delete Number</button> 
     </div> 

     <button ng-click="addNumber()">Add Number</button> 

     <input type="submit" ng-disabled="form.$invalid" /> 

    </form> 

</body> 

Controller:

app.controller('MainCtrl', function ($scope) { 

    $scope.phoneNumbers = [{ 
     number: '212-123-4567' 
    }]; 

    $scope.addNumber = function() { 
     $scope.phoneNumbers.push({ 
      number: '' 
     }); 
    }; 

    $scope.deleteNumber = function (index) { 
     $scope.phoneNumbers.splice(index, 1); 
    }; 

}); 

Ecco il Plunkr: Working example.

Penso che il codice sia piuttosto semplice: c'è uno ng-repeat che visualizza ogni numero di telefono, che è possibile modificare/eliminare. Se viene aggiunto un numero di telefono, non può essere vuoto; il pulsante di invio sarà disabilitato se c'è un numero di telefono vuoto.


Il problema sorge quando il pulsante di invio è disposto sopra la ng-repeat. Se si aggiunge un numero di telefono, lasciarlo vuoto, e quindi eliminarlo, il pulsante di invio rimarrà disattivato:

<body ng-controller="MainCtrl"> 

    <form name="form"> 

     <input type="submit" ng-disabled="form.$invalid" /> 

     <div ng-repeat="phone in phoneNumbers"> 
      <input ng-model="phone.number" required /> 
      <button ng-click="deleteNumber($index)">Delete Number</button> 
     </div> 

     <button ng-click="addNumber()">Add Number</button> 

    </form> 

</body> 

Ecco il plunkr: Broken example.


Amo AngularJS, ma questo mi ha quasi fatto impazzire. Ho passato più di 20 ore a inseguire questo stupido bug. Poiché una normale demo ha il pulsante di invio in basso, non è stato possibile riprodurre il problema. Ho dovuto prendere il mio codice effettivo e ridurre lentamente il codice al minimo indispensabile. È un'app molto grande e complessa, e ... beh, smetterò di piagnucolare ora.

La mia domanda è duplice:

  1. Si tratta di un bug? Ho anche provato questo con il ramo instabile (1.1.3), e funziona allo stesso modo.

  2. Cosa posso fare per aggirare il problema, senza cambiare l'ordine di origine. So che posso spostare il mio pulsante di invio tramite CSS, ma nel mio caso non è davvero un'opzione; Ho bisogno che il pulsante di invio sia la prima cosa nel modulo.


P.S. Here's a video of it in action.

+1

Non conosco la risposta alla tua domanda, ma sembra che se si modifica l'elemento di invio su un pulsante di base invece di un '', funziona come previsto, ad es. ' Invia'. Questo aiuta come soluzione? – Marc

+0

stava giocando con plunkr rotto e immissione '{{}} phoneNumbers' in html di visualizzare ciò che stava accadendo di opporsi anche fermato l'emissione e l'output era corretta. Ovviamente non una soluzione alternativa ma interessante – charlietfl

+1

+1 per un modo corretto di porre una domanda sul tag angularjs. – Stewie

risposta

5

Apparentemente questo è un bug attivo.

Vedi https://github.com/angular/angular.js/issues/1572

In questo bug, una soluzione è stata pubblicata, che utilizza un contatore nascosto che viene incrementato quando vengono aggiunti/rimossi campi - questo è usato per forzare angolare di ri-convalidare il formulario.

Un esempio jsFiddle è stato dato: http://jsfiddle.net/HhcXT/

in Template:

<input type="hidden" ng-bind="abc" /> 

In regolatore:

$scope.removeYears = function(item) { 
    var index = $.inArray(item, $scope.years) 
    $scope.years.splice(index, 1);  //remove element 
    $scope.abc += 1; 
} 
+0

Grazie! Questo è stato. Per curiosità: quale termine di ricerca hai usato per trovare questo bug report? Ho cercato per un po 'di tempo prima di pubblicare questo, ma non ho trovato nulla. –

+0

Penso che la ricerca fosse 'sito: github.com modulo angularjs. $ Non valido non si aggiorna.' Per esperienza personale, i bug su github sono spesso molto utili in quanto lo standard è di fornire esempi di lavoro e soluzioni alternative, come in questo caso. –

+0

Grazie a @Alex. Mi hai salvato un sacco di (ulteriore) dolore :) –

Problemi correlati