Ich habe Code in Aktion, der gut funktioniert, wenn die Person nur einmal auf die Schaltfläche klickt, aber wenn sie mehrere Male schnell auf die Schaltfläche klicken, wird dieser Code viele Male ausgeführt und seltsam erstellt Probleme. Kann jemand das verhindern?Verhindern, dass Code mehrmals in Aktion ausgeführt wird
Antwort
Fügen Sie diese zu Ihrer Schaltfläche hinzu.
onclick="this.disabled=true;"
Beispiel:
<button onclick="this.disabled=true;">Click</button>
Wenn Sie auf die Schaltfläche klicken, wird das Onclick läuft sofort und deaktiviert die Schaltfläche, um zusätzliche Klicks zu verhindern.
Sie möchten das Attribut disabled
Ihres <button>
/so einstellen, dass Benutzer es nicht erneut auslösen, während Sie die erste Aktion ausführen. Um dies zu tun, verwende ich normalerweise ein Flag, um festzustellen, ob diese Aktion gerade verarbeitet wird. Wenn das Flag gesetzt ist, setzen Sie das Attribut disabled
. Es ist auch eine gute Idee, eine Wächter-Anweisung in Ihrer Aktion zu haben. Da manche Browser das disabled
Attribut nicht respektieren.
Controller/Komponente:
import Ember from 'ember';
import moment from 'moment';
export default Ember.Controller.extend({
isLoading: false,
actions: {
yourAction() {
// It's a good idea to use a guard statement here as well. Just incase the browser doesn't respect the `disabled` attribute.
if(this.get('isLoading')) {
return;
}
this.set('isLoading', true);
// Do your work here. If it's a promise, use `finally` to unset the flag to avoid forever loading on errors.
this.set('isLoading', false);
}
}
}
Vorlage:
<button {{action 'yourAction'}}
disabled={{isLoading}}>
Your Action
</button>
Mit dieser Methode können Sie auch auch einige Laden Styling auf Aktion hinzufügen. Vielleicht ein Spinner als Pseudo-Element:
Vorlage:
<button class="{{if isLoading 'loading'}}"
{{action 'yourAction'}}
disabled={{isLoading}}>
Your Action
</button>
bearbeiten
Als ykaragol mentioned, wenn Sie wollen/können eine Bibliothek zu Ihrer Ember App hinzufügen, wird ember-concurrency
stark das native Beispiel Ember vereinfachen über. Sie haben eine Anleitung here, die das obige Beispiel in ein besser lesbares Beispiel mit ember-concurrency
umgestaltet.
Die erste Lösung ist Deaktivieren der Schaltfläche nach dem Klicken durch Festlegen der disabled
Eigenschaft der Schaltfläche.
Obwohl Einstellung disabled
Eigenschaft der Schaltfläche kann die Lösung vollständig lösen; Die wieder zu aktivieren Logik in den Code ist nicht nett, wenn einige asynchrone Operation ausgeführt wird.
Darüber hinaus kann die erneute Aktivierung der Schaltfläche komplexer sein, wenn Sie andere Bedingungen zum Deaktivieren der Schaltfläche haben. (Wenn z. B. ein Feld auf dem Formular einen ungültigen Wert hat, können Sie die Schaltfläche wieder deaktivieren.)
Wir bevorzugen meistens ember-concurrency
Addon für solche Bedürfnisse. Seine Struktur task
bietet in den meisten Fällen einen besser lesbaren Code.
- 1. Verhindern, dass Code vom Benutzer ausgeführt wird
- 2. Verhindern, dass Cron mehrmals läuft Rails Loadbalancer
- 3. verhindern, dass Javascript zweimal ausgeführt wird
- 4. Verhindern, dass innere Funktion ausgeführt wird
- 5. So verhindern Sie, dass eine Aktivität mehrmals initialisiert wird
- 6. verhindern, dass die Unterfenster mehrmals geöffnet werden
- 7. verhindert, dass die Funktion während der Ausführung mehrmals ausgeführt wird
- 8. Verhindern, dass die Fehlerseite direkt von einer Anfrage ausgeführt wird
- 9. Wie kann ich verhindern, dass meine App mehrmals gestartet wird?
- 10. So verhindern Sie, dass Webpack mehrmals aus den Makefile-Rezepten ausgeführt wird
- 11. Verhindern, dass TablewViewHeader angezeigt wird, wenn [tableView reloadData] ausgeführt wird
- 12. Sollte das Setzen von onsubmit auf "false" nicht verhindern, dass die Aktion des Formulars ausgeführt wird?
- 13. Verhindern, dass checkstyle in einem bestimmten maven-Submodul ausgeführt wird
- 14. Verhindern, dass onblur Code ausgeführt wird, wenn auf "Senden" geklickt wird
- 15. Welche Ausnahme wird verwendet, um zu verhindern, dass eine Methode mehrmals aufgerufen wird?
- 16. VBA-Arbeitsblatt-Änderungscode, der mehrmals ausgeführt wird
- 17. Firebase RTDB `ref.once()` wird mehrmals ausgeführt
- 18. Wie wird das gleiche Fragment mehrmals ausgeführt?
- 19. Verhindern Sie, dass die Übertragung zweimal ausgeführt wird
- 20. JS verhindern, dass eine Funktion als onclick-Ereignis ausgeführt wird
- 21. Verhindern, dass Hook `post-commit` für Submodule ausgeführt wird
- 22. Verhindern, dass eine Methode während der Tests ausgeführt wird Codeception
- 23. Verhindern, dass das Ereignis ausgeführt wird, während ein anderer ausgeführt wird
- 24. So verhindern Sie, dass der Direktiven-Controller zweimal ausgeführt wird
- 25. Verhindern, dass das Tablet schläft, während die App ausgeführt wird
- 26. So verhindern Sie, dass ein Systemaufruf mit ptrace ausgeführt wird
- 27. Verhindern, dass Methode gleichzeitig aus verschiedenen Threads ausgeführt wird
- 28. Was bewirkt, dass "Code by Zapier" -Trigger unabhängig ausgeführt wird?
- 29. .ajaxStop Callback-Funktion wird mehrmals ausgeführt
- 30. Wie ein UIDatePicker zu verhindern, dass sie mehrmals
Ich versuchte mit Ember-Concurrency es scheint nicht das Problem zu beheben. Grundsätzlich habe ich eine Logik, die basierend auf einem Zähler, wenn Sie auf einen Button klicken, erhöht den Zähler um 1 und was passiert im Wesentlichen, wenn Sie ziemlich schnell klicken, beenden Sie seine Schritte um 2 und es versauen meine Logik.also versuche ich, diese Variablen zu sperren, denke ich, dass kein Mather, wie oft Sie es klicken, wird 1 mal inkrementieren – jpoiri
dann hilft 'Deaktivieren' Ihnen? Wenn Sie Twiddle bieten, kann ich weiter schauen. – ykaragol
Nein, das war meine erste Lösung und ich kann sie immer noch reproduzieren – jpoiri