Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: watch
Forum PHP.pl > Forum > Po stronie przeglądarki
smiady
Witam.

Ostatnio spotkałem się z dziwnym przypadkiem.

Kod jest całościowy, więc można skopiować i przetestować na swoim (potrzebny jest jeszcze plik angular.js)

  1. <!DOCTYPE html>
  2. <html lang="pl">
  3. <head>
  4. <meta charset="utf8" />
  5. <title>watch</title>
  6. </head>
  7. <body>
  8. <div ng-app="app">
  9. <div ng-controller="WatchCtrl">
  10. <tr>
  11. <th>
  12. <label for="firstName">firstName</label>
  13. </th>
  14. <td>
  15. <input id="firstName" ng-model="firstName" />
  16. </td>
  17. </tr>
  18. <tr>
  19. <td colspan="2">
  20. <button ng-click="fire()">Fire!</button>
  21. </td>
  22. </tr>
  23. </table>
  24. </div>
  25. </div>
  26.  
  27. <script type="text/javascript" src="angular.js"></script>
  28. <script type="text/javascript">
  29. var module = angular.module('app', []);
  30.  
  31. module.controller('WatchCtrl', function($scope) {
  32. $scope.firstName = '';
  33.  
  34. $scope.stop = true;
  35.  
  36. $scope.$watch('firstName', function(newValue, oldValue) {
  37. if(!$scope.stop) {
  38. console.log('works!');
  39. }
  40. });
  41.  
  42. $scope.fire = function() {
  43. $scope.stop = true;
  44. $scope.firstName = 'change';
  45. $scope.stop = false;
  46. };
  47. });
  48. </script>
  49. </body>
  50. </html>


Zastanawia mnie jak po odpaleniu fire wywali mi konsole works! jak przecież przy zmianie scopa na change mam nałożoną blokadę w postaci zmiennej stop. !?
Rochu
$watch odpali Ci sie zawsze po zmianie wartosci firstName, co do funkcji fire to ta funkcja WYKONA SIE OD POCZATKU DO KONCA, a dopiero potem - jezeli przez w tej funkcji nastapi zmiana wartosci firstName to odpali sie watch, wiec majac cos takiego:

  1. $scope.fire = function() {
  2. $scope.stop = true;
  3. $scope.firstName = 'change';
  4. $scope.stop = false;
  5. };


po wykonaniu funkcji fire zmienna $scope.stop zawsze bedzie miala wartosc false

-----
Proste wytlumaczenie jak odpalaja Ci sie funkcje:

Poczatkowo pole masz puste, np. wpiszesz 1 znak -> odpali sie $watch, wpiszesz drugi znak -> odpali sie $watch itd. ($scope. stop jest domyslnie ustawiony na true, wiec nie wyrzuci Ci nic do konsoli)
Klikajac na przycisk odpalisz funkcje fire() -> wykona sie ona cala, czyli za kazdym razem po zakonczeniu wykonania funkcji fire() $scope.stop bedzie mialo wartosc false
Po tym wykona sie $watch i wtedy juz wyswietli Ci w konsoli wiadomosc -> kazda kolejna zmiana w polu spowoduje to samo, gdyz $scop.stop juz caly czas bedzie mialo wartosc false
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.