דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. עיצוב date ב JS + אנגולר

עיצוב date ב JS + אנגולר

מתוזמן נעוץ נעול הועבר תכנות
7 פוסטים 3 כותבים 955 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • מנצפךמ מנותק
    מנצפךמ מנותק
    מנצפך
    כתב ב נערך לאחרונה על ידי מנצפך
    #1

    אני מקבל מהשרת זמן בפורמט כזה:
    2018-03-07T22:00:00.000Z

    כשאני מנסה להכניס אותו לUI ע"י אנגולר (משהו כזה:
    <input type="date" ng-model="Exp" readonly>
    אני מקבל שגיאה:
    angular.js:14800 Error: [ngModel:datefmt] Expected 2018-03-07T22:00:00.000Z to be a date
    וזה בגלל הפורמט של התאריך.
    אני יכול פשוט לשנות את התאריך בקוד כך:

     let d = new Date($scope.Exp);
            $scope.Exp=d;
    

    זה עובד פרפקט.
    השאלה היא האם אפשר לפתור את זה יותר אלגנטי ברמת הUI של אנגולר. ולא בקוד של הסקופ. כי זה יצריך לעשות כך בכל סקופ שמציג תאריכים.
    תודה.

    בנוסף, ניסיתי לעשות פונקציה בסקופ, עם הלודיקה שנכתבה כאן למעלה נקרא לה dateFormatted, ולקרוא לה מהUI. כך:
    (ng-model="dateFormatted(Exp"
    אך הבעיה שם היתה שהפונקציה עצמה לא הצליחה להמיר את הנתונים ל Date.
    האם הייתי מובן? תודה!

    מנצפךמ תגובה 1 תגובה אחרונה
    0
    • מנצפךמ מנותק
      מנצפךמ מנותק
      מנצפך
      השיב למנצפך ב נערך לאחרונה על ידי
      #2

      עכשיו אני מבין שמה שניסתי לעשות בכל מקרה לא היה עובד בגלל שאי אפשר לחבר (בצורה כזאת) את המודל עם הפונקציה.

      תגובה 1 תגובה אחרונה
      0
      • dovidD מחובר
        dovidD מחובר
        dovid ניהול
        כתב ב נערך לאחרונה על ידי
        #3

        הבעיה זה לא הפורמט. הבעיה היא שזה מגיע מהשרת כטקסט, וזה תמיד ככה.
        שרת תמיד שולח טקסט, ואפילו אם זה פורמט JSON שהופך לאובייקטים, עדייi אין בJSON מושג ששמו תאריך.
        לכן אתה מוכרח להשתמש בפונקציה, שבל זה לא יכול להיעשות בng-model שכן זה בינדינג דו כיווני - מה יקרה כשהמשתמש ישנה את הערך? אתה חייב להחזיק עותק של המשתנה שהוא בקוד יהיה מסוג תאריך.
        אם אתה מוותר על הtype="data" אתה פותר את כל הבעיה, אבל כנראה תרצה להשתמש עם תוסף שיציג בורר תאריכים אחר מהמובנה של כרום (שמצריך type="date").

        מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

        בכל נושא אפשר ליצור קשר dovid@tchumim.com

        תגובה 1 תגובה אחרונה
        2
        • מנצפךמ מנותק
          מנצפךמ מנותק
          מנצפך
          כתב ב נערך לאחרונה על ידי מנצפך
          #4

          תודה @dovid על ההסבר מדוע אי אפשר לעשות ע"י ng-model. עכשיו אני מבין.

          ראיתי שיש אפשרות ע"י ng-value (במקום ng-model) עם settet ו - getter. אבל לא נכנסתי לזה.

          אני באמת ארצה להשתמש בקונטרול אחר בשביל התאריך. עם תמיכה בתאריך עברי (זה די קריטי כאן). יש משהו מומלץ? (עם תמיכה נוחה באנגולר כמובן 🙂 ) משהו שישלב גם לועזי. או באותו פקד, או ע"י בינדינג.

          תגובה 1 תגובה אחרונה
          1
          • zvizviZ מנותק
            zvizviZ מנותק
            zvizvi
            כתב ב נערך לאחרונה על ידי zvizvi
            #5

            דיירקטיב שכתבתי עבור הבעיה הזאת

            import angular from 'angular';
            import moment from 'moment';
            
            let inputDateModule = angular.module('inputDate', [])
              .directive('inputDate', inputDateDirective)
              .name;
            
            function inputDateDirective ($window) {
              return {
                require: 'ngModel',
                link: function (scope, element, attr, ctrl) {
                  var vm = ctrl;
                  if (!vm) {
                    return;
                  }
            
                  vm.$formatters.unshift(function (a) {
                    if (vm.$modelValue) {
                      var date = moment(vm.$modelValue);
                      if (!date._isValid) {
                        return '';
                      }
                      return date.format('DD/MM/YYYY');
                    }
                  });
                  vm.$parsers.unshift(function (viewValue) {
                    if (viewValue && moment(viewValue, 'DD/MM/YYYY')._isValid) {
                      return moment(viewValue, 'DD/MM/YYYY').format();
                    }
                  });
                }
              };
            }
            
            inputDateDirective.$inject = ['$window'];
            export default inputDateModule;
            
            <input type="text"  input-date />
            

            וצריך להתקין moment.

            https://zvizvi.xyz

            מנצפךמ תגובה 1 תגובה אחרונה
            4
            • מנצפךמ מנותק
              מנצפךמ מנותק
              מנצפך
              השיב לzvizvi ב נערך לאחרונה על ידי
              #6

              @zvizvi תודה.
              כל הקוד צריך להיכנס לאותו קובץ?
              ואיפה ההכנסה של הדיירקטיב לתוך המודל אנגולר שלי? (נניח שהמודל שלי נקרא myApp)

              zvizviZ תגובה 1 תגובה אחרונה
              0
              • zvizviZ מנותק
                zvizviZ מנותק
                zvizvi
                השיב למנצפך ב נערך לאחרונה על ידי
                #7

                @מנצפך אמר בעיצוב date ב JS + אנגולר:

                @zvizvi תודה.
                כל הקוד צריך להיכנס לאותו קובץ?
                ואיפה ההכנסה של הדיירקטיב לתוך המודל אנגולר שלי? (נניח שהמודל שלי נקרא myApp)

                הקוד הזה כתוב בES6, אני מניח שתרצה להמיר אותו לjavascript רגיל.

                לתוך המודל אתה מכניס 'inputDate'.

                https://zvizvi.xyz

                תגובה 1 תגובה אחרונה
                0

                בא תתחבר לדף היומי!
                • התחברות

                • אין לך חשבון עדיין? הרשמה

                • התחברו או הירשמו כדי לחפש.
                • פוסט ראשון
                  פוסט אחרון
                0
                • דף הבית
                • קטגוריות
                • פוסטים אחרונים
                • משתמשים
                • חיפוש
                • חוקי הפורום