2014-11-28 4 views
16

**** Hinweis Ich habe einige meiner anderen Funktionen ausgeschnitten, damit der Code schneller gelesen werden kann. Ich kann das Formular nicht löschen. wenn ich auf die Schaltfläche mit der Abbrechen-Funktion klicke. Ich dachte, ich könnte ein Standardformular festlegen, aber das macht keinen Unterschied.

<form name="myForm" novalidate ng-submit="submit()"> 
    <table class="mealCost"> 

     <!-- descriptions --> 
     <tr> 
      <td> Base Meal Price: </td> 
      <td><input type="number" name="price" ng-model="mealPrice" required></td> 
     </tr> 
     <!-- waiter puts in the info --> 
     <tr> 
      <td> Tax Rate: % </td> 
      <td><input type="number" step="0.01" name="tax" ng-model="mealTax" required></td> 

     </tr> 

     <tr> 
      <td> Tip Percentage: % </td> 
      <td><input type="number" name="tip" step="0.01" ng-model="tipPercent" required></td> 

     </tr> 

    </table> 

    <p class="userResponse"> 
    <input type="submit" value="Submit"> 
    <!-- <input id="cancel" type="submit" value="Cancel" ng-submit="cancel(original)"> --> 
    <button ng-click="cancel()">Start Over</button> 
    </p> 

</form> 

Hier ist mein Javascript Ich versuche, meine Form zu setPristine die Schaltfläche Befehl wiht ng Klick mit $ einzustellen. Ich aber, dass ein Standardformular Einstellung würde helfen, aber nichts passiert anschließend auf

var app = angular.module('myApp',[]). 
    controller('costController', function($scope) { 
     // $scope.ready= false; 
     $scope.mealPrice ="" ; 
     $scope.mealTax = 0.05; 
     $scope.tipPercent =0.05; 
     // possibly could do 

     var defaultForm={ 
      price: "", 
      tax: "", 
      tip:"" 
     } 

$scope.cancel = function() { 
      $scope.myForm.$setPristine(); 
      $scope.user = angular.copy(defaultForm); 
      console.log('empty'); 
     } 

Antwort

23

Ich glaube, Sie es falsch verwenden.

$ setPristine.

„Diese Methode wird aufgerufen werden, kann die‚ng-dirty‘Klasse zu entfernen und das Formular zu seinem ursprünglichen Zustand (ng-pristine Klasse) eingestellt Diese Methode wird auch auf alle Steuerelemente propagieren in dieser Form enthalten. "

Dies löscht nur Klassen, aber nicht die $ Scope-Variablen. Sie setzen eine $ scope.user Variable zurück, könnte sagen:

Hinzufügen 'Benutzer.' vor jedem Modell in der Html

ng-model="user.tipPercent" 
ng-model="user.mealTax" 
ng-model="user.mealPrice" 

Und ersetzen Sie dies in Ihrem JS:

// $scope.ready= false; 
$scope.mealPrice ="" ; 
$scope.mealTax = 0.05; 
$scope.tipPercent =0.05; 
// possibly could do 

var defaultForm={ 
    price: "", 
    tax: "", 
    tip:"" 
} 

$scope.cancel = function() { 
    $scope.myForm.$setPristine(); 
    $scope.user = angular.copy(defaultForm); 
    console.log('empty'); 
} 

dazu:

var defaultForm = { 
    mealPrice : "", 
    mealTax : 0.05, 
    tipPercent : 0.05 
} 

$scope.user = angular.copy(defaultForm); 

$scope.cancel = function() { 
    $scope.myForm.$setPristine(); 
    $scope.user = angular.copy(defaultForm); 
    console.log('empty'); 
} 
+0

Huge dank Jason. Ich hatte das ein Dutzend Mal bearbeitet und kam mir nahe. Benutzer hinzufügen behoben! – Winnemucca

+1

Ich folgte oben erklären Beispiel, aber jedes Mal bekommen "Fehler: Fehler: nicht definiert ist kein Objekt (Bewertung '$ scope.ContactForm. $ SetPristine')" –

1

Diese funktionieren würde, wenn die ng-model-$scope.user.price gebunden waren, $scope.user.tax und $scope.user.tip. Sie sind jedoch an $scope.price, $scope.tax und $scope.tip gebunden.

Die Einstellung $pristine markiert nur die Werte, die vom Benutzer nicht geändert wurden. Es ändert die Werte nicht wirklich.

Lösung A:

Bind die Modelle zu user.* und

$scope.mealPrice = ''; 
$scope.mealTax = 0.05; 
$scope.tipPercent = 0.05; 

mit

$scope.user = { 
    mealPrice: '', 
    mealTax: 0.05, 
    tipPercent: 0.05 
}; 

Lösung B ersetzt werden:

Repla ce:

$scope.user = angular.copy(defaultForm); 

mit

$scope.mealPrice = defaultFrom.mealPrice; 
$scope.mealTax = defaultFrom.mealTax; 
$scope.tipPercent = defaultFrom.tipPercent; 
2
$scope.master = {}; 

$scope.reset = function(form) { 

     if (form) { 
      form.$setPristine(); 
      $scope.user = angular.copy($scope.master); 
     form.$setUntouched(); 
     } 
+7

Antworten, die nur Code enthalten sind keine Antworten. –

+2

Es würde Ihre Antwort wirklich verbessern, wenn Sie einige Wörter der Erklärung, vielleicht einen Link zu etwas in Verbindung stehender Dokumentation als auch hinzufügten. Die Person, die diese Frage stellt, und jede andere Person, die dies in der Zukunft liest, wird keine Möglichkeit haben zu sagen, ob Ihre Lösung funktioniert, ohne dass Sie zufälligen Code kopieren/einfügen und ausführen. Das ist nie eine gute Idee. Erkläre, was das ist, warum es das tut und warum es mit dem Problem zusammenhängt. Erklären Sie, warum dies besser oder anders ist als die Antwort, die vor 6 Monaten angenommen wurde. –

+0

Das Formular wird in Bootstrap Modal angezeigt. Also jedes Mal, wenn ich es zeige, setze ich das Modell zurück. Wenn ich jedoch versuchte, das leere Formular zu speichern, Fehler erhalten und das Modal schließen und es erneut öffnen, wurden die Fehler nicht gelöscht. Meistens ist die Fehleranzeige im Formular mit formName.fieldName.touched == true gekoppelt. Also setze einfach form. $ SetUntouched() hat den Trick für mich gemacht. Vielen Dank – pravin

Verwandte Themen