এনজি-মডেল ব্যবহার করে কোনও তারিখ কীভাবে ফর্ম্যাট করবেন?


94

আমি হিসাবে একটি ইনপুট হিসাবে সংজ্ঞায়িত করা আছে

<input class="datepicker" type="text" ng-model="clientForm.birthDate" />

যা পৃষ্ঠায় অন্য কোথাও প্রদর্শিত হবে তা ছড়িয়ে দেওয়া হয়েছে:

<tr>
    <th>Birth Date</th>
    <td>{{client.birthDate|date:'mediumDate'}}</td>
</tr>

পৃষ্ঠাটি লোড করার পরে জন্মের তারিখটি সুন্দরভাবে ফর্ম্যাট করা হয় এরকম কিছু হিসাবে Dec 22, 2009। যাইহোক, আমি যখন আমার অভ্যন্তরটি দেখি তখন <input>এটি প্রদর্শিত হয় Tue Dec 22 2009 00:00:00 GMT-0800 (Pacific Standard Time)যা আমি অনুমান করি যে জেএস কীভাবে Dateবস্তুকে স্ট্রিং হিসাবে রেন্ডার করে।

প্রথমত, আমি কৌনিকটিকে কীভাবে <input>কিছু তারিখ দেখানোর জন্য বলি 12/22/2009? আমি এট্রিবিউটটির |filtersভিতরে প্রয়োগ করতে পারি না ng-model

দ্বিতীয়ত, আমি তারিখটি সম্পাদনা করার সাথে সাথে এটিকে আসল বিন্যাসে রেখেই আমার অন্য পাঠ্যটি (এর অভ্যন্তরে <td>) |dateফিল্টারটি আর প্রয়োগ করবে বলে মনে হয় না; এটি হঠাৎ ইনপুট পাঠ্যবক্সের সাথে মেলে ফর্ম্যাটগুলি পরিবর্তন করে। |dateপ্রতিবার মডেল পরিবর্তিত হলে আমি কীভাবে এটি ফিল্টার প্রয়োগ করতে পারি ?


সম্পর্কিত প্রশ্নগুলি:


এতে আমারও সমস্যা ছিল, তবে স্ট্যান্ডার্ড জেএস Date()ফাংশনগুলি ব্যবহার করে সহজ সমাধান নিয়ে এসেছি : $scope.departDate = new Date(); $scope.departTime = $scope.departDate.toTimeString().slice(0, 5);এবং অ্যাঙ্গুলারজেএস আইএমওতে অন্যান্য ফিল্টার বা কৌতূহলপূর্ণ কাজের প্রয়োজন নেই।
বোল্ডনিক

উত্তর:


71

ফরম ব্যবহার করুন কাস্টম বৈধতা http://docs.angularjs.org/guide/forms ডেমো: http://plnkr.co/edit/NzeauIDVHlgeb6qF75hX?p=preview

ফর্ম্টার এবং পার্সার এবং মোমেন্টজেএস ব্যবহার করে নির্দেশিকা )

angModule.directive('moDateInput', function ($window) {
    return {
        require:'^ngModel',
        restrict:'A',
        link:function (scope, elm, attrs, ctrl) {
            var moment = $window.moment;
            var dateFormat = attrs.moDateInput;
            attrs.$observe('moDateInput', function (newValue) {
                if (dateFormat == newValue || !ctrl.$modelValue) return;
                dateFormat = newValue;
                ctrl.$modelValue = new Date(ctrl.$setViewValue);
            });

            ctrl.$formatters.unshift(function (modelValue) {
                if (!dateFormat || !modelValue) return "";
                var retVal = moment(modelValue).format(dateFormat);
                return retVal;
            });

            ctrl.$parsers.unshift(function (viewValue) {
                var date = moment(viewValue, dateFormat);
                return (date && date.isValid() && date.year() > 1950 ) ? date.toDate() : "";
            });
        }
    };
});

4
আমি ফর্মার এবং পার্সারের একটি ছোট উদাহরণ তৈরি করতে চেয়েছিলাম, আজ আপনার প্রশ্নের জন্য আমি এটি করার কারণ পেয়েছি।
সানিশাহ

4
@ মার্ক, নান ইস্যুটি দ্বিতীয় গলিতে স্থির করুন। ;)
সানিশাহ

4
দ্বিতীয় পদ্ধতির সরানো হয়েছে। এটা খুব বগি ছিল।
সানিশাহ

4
আপনি আরও উন্নতি করতে অন-পরিবর্তন নির্দেশিকা ব্যবহার করতে পারেন। stackoverflow.com/questions/14477904/...
SunnyShah

7
@ সানিশাহ - দুর্দান্ত জিনিস, সত্যই সহায়ক, অনেক ধন্যবাদ। আমি ভাবছিলাম যে আপনার কাছে কেন var dateFormat = attrs.moMediumDate;এবং var dateFormat = attrs.moDateInput;এমএমডিয়ামডেটটি কোথাও সেট করা আছে বলে মনে হয় না যদি ইনপুটগুলি গতিশীলভাবে তৈরি না হয় তবে কোনও প্রাথমিক বিন্যাসটি কখনও নির্বাচন করা হয় না।
toxaq

37

এখানে খুব কার্যকর নির্দেশ কৌণিক-তারিখের সময় । আপনি এটি এর মতো ব্যবহার করতে পারেন:

<input type="text" datetime="yyyy-MM-dd HH:mm:ss" ng-model="myDate">

এটি আপনার ইনপুটটিতে মুখোশ যুক্ত করে বৈধতা কার্যকর করে।


4
আমি এই নির্দেশটিও ব্যবহার করেছি, ধন্যবাদ। আপনি যদি এটি jQuery UI তারিখপিকারের সাথে ব্যবহার করে থাকেন তবে আপনাকে অবশ্যই নিশ্চিত করতে হবে যে datetime="<format>"অ্যাট্রিবিউটের মানটিতে নির্দিষ্ট ফর্ম্যাটটি ডেটপিকারের dateFormatবিকল্পটিতে উল্লিখিত বিন্যাসের সাথে মেলে ।
টাইলারওয়াল

4
আমি আশ্চর্য হলাম কীভাবে সম্ভব যে এখানে মাত্র কয়েকটি আপ ভোট দিয়ে একটি নিখুঁত সমাধান পাওয়া যায়। তারিখের জন্য অনেক কিছু, এবং আপনি এখনই এগুলি সমাধান করতে পারেন! ধন্যবাদ দোস্ত.
C0ZEN

4
আমি নিশ্চিত যে বিদ্যমান কৌণিক অ্যাপ্লিকেশনটিতে অন্তর্ভুক্ত করা আরও সহজ করার জন্য ডকুমেন্টেশনটি উন্নত করা হলে আরও বেশি লোক এটিকে ভোট দেবে I'm
জোয়েল হানসেন

8

আমি input[type="date"]অ্যাঙ্গুলারজেএস ~ 1.2.16 এর সাথে স্ট্যান্ডার্ড ফর্ম উপাদানগুলিকে সঠিকভাবে কাজ করতে সক্ষম করার জন্য একটি সহজ নির্দেশিকা তৈরি করেছি created

এখানে দেখুন: https://github.com/betsol/angular-input-date

এবং এখানে ডেমো রয়েছে: http://jsfiddle.net/F2LcY/1/


আরে @ লরেঞ্জো, আপনার মানে কী? আপনি দয়া করে বিস্তারিত বলতে পারেন?
স্লাভা ফমিন দ্বিতীয়

মাসের দিনটি ফরাসি ভাষায় সোম লু, ওয়েনের জন্য লুন মার
মার্লিন

@ লোরেঞ্জো আমি নিশ্চিত নই যে আমি অপরিবর্তিত। স্থানীয়করণের সাথে এই নির্দেশিকার কোনও যোগসূত্র নেই। সম্ভবত আপনি যে ফর্ম্যাটিং ফাংশনটি ব্যবহার করছেন তা আপনার ব্রাউজার / সিস্টেম থেকে লোকেল সেটিংটি নিচ্ছে। আপনি যদি একটি উদাহরণ সরবরাহ করেন তবে আমি সহায়তা করতে সক্ষম হব (jsfiddle)।
স্লাভা ফমিন দ্বিতীয়

4
শুধু ক্রোম সমর্থন, খুব খারাপ।
মিথুনিওলো

নির্দেশের লক্ষ্য হ'ল সমস্ত প্ল্যাটফর্মকে সমর্থন করা। এটি নিয়ে যদি আপনার সমস্যা থাকে তবে আপনি গিটহাব রেপোতে কেন কোনও সমস্যা তৈরি করবেন না? আমি সবসময় সব ইস্যুতে সাড়া দিচ্ছি।
স্লাভা ফমিন II

7

আমি তারিখ নির্বাচন করতে jquery ডেটপিকার ব্যবহার করছি। আমার নির্দেশিকা পড়ার তারিখ এবং ফর্ম্যাট করা তারিখ ng-modelপ্রদর্শন করার সময় এটি জসন ডেট ফর্ম্যাটে (মিলি সেকেন্ডে) স্টোরে রূপান্তরিত করে and

এইচটিএমএল কোড:

<input type="text" jqdatepicker  ng-model="course.launchDate" required readonly />

কৌণিক নির্দেশিকা:

myModule.directive('jqdatepicker', function ($filter) {
    return {
        restrict: 'A',
        require: 'ngModel',
         link: function (scope, element, attrs, ngModelCtrl) {
            element.datepicker({
                dateFormat: 'dd/mm/yy',
                onSelect: function (date) {   
                    var ar=date.split("/");
                    date=new Date(ar[2]+"-"+ar[1]+"-"+ar[0]);
                    ngModelCtrl.$setViewValue(date.getTime());            
                    scope.$apply();
                }
            });
            ngModelCtrl.$formatters.unshift(function(v) {
            return $filter('date')(v,'dd/MM/yyyy'); 
            });

        }
    };
});

ওরে আমার গোশ !! আপনাকে অনেক ধন্যবাদ !! আমি এই উত্তরটির মতো কিছু জন্য আক্ষরিকভাবে দু'দিন খুঁজছিলাম, কিন্তু একটিও পাইনি! তুমি রক!
মাইকেল ভাড়া ভাড়া

কল্পনাপ্রসূত। আমি কিছুক্ষণের জন্য এই জাতীয় কিছু সন্ধান করছি। আমি আমার সমাধানের জন্য ম্যাটারিয়ালেসেকস ব্যবহার করছি। যদি কেউ এটির উপর অবিচল থাকে এবং এই নির্দেশকে বস্তুগতকরণের জন্য রূপান্তর করতে হয় তবে কেবল তার element.datepickerসাথে element.pickadate
বদলি করুন

7

যেহেতু আপনি ডেটপিকারকে ক্লাস হিসাবে ব্যবহার করেছেন আমি ধরে নিচ্ছি আপনি কোনও জ্যাকুরি ডেটপিকার বা অন্য কিছু অনুরূপ ব্যবহার করছেন।

মুহুর্ত.জগুলি মোটেও ব্যবহার না করে আপনি যা চান তা করার একটি উপায় রয়েছে, খালি খালি ডেটপিকার এবং কৌণিক নির্দেশাবলী ব্যবহার করে।

আমি এই ফিডল এ এখানে একটি উদাহরণ দিয়েছি

এখানে ঝাঁকুনির অংশগুলি:

  1. ডেটপিকারের একটি আলাদা ফর্ম্যাট থাকে এবং কৌণিক প্রকারের ফর্ম্যাটটি আলাদা, উপযুক্ত ম্যাচটি খুঁজে নেওয়া দরকার যাতে তারিখটি নিয়ন্ত্রণে পূর্বনির্ধারিত হয় এবং এনজি-মডেল সীমাবদ্ধ থাকাকালীন ইনপুট ক্ষেত্রেও পপুলিটেড থাকে। নীচের বিন্যাসটি 'mediumDate'AngularJS এর ​​বিন্যাসের সমতুল্য ।

    $(element).find(".datepicker")
              .datepicker({
                 dateFormat: 'M d, yy'
              }); 
    
  2. তারিখের মানব পাঠযোগ্য ফর্ম উপস্থাপনের জন্য তারিখ ইনপুট নির্দেশের অন্তর্বর্তী স্ট্রিং ভেরিয়েবল থাকা দরকার।

  3. পৃষ্ঠার বিভিন্ন বিভাগে রিফ্রেশ হওয়া ইভেন্টগুলির মতো, $broadcastএবং এর মাধ্যমে ঘটতে হবে $on

  4. মানব পাঠযোগ্য আকারে তারিখের প্রতিনিধিত্ব করতে ফিল্টার ব্যবহার করা এনজি-মডেলেও সম্ভব তবে অস্থায়ী মডেলের পরিবর্তনশীল সহ with

    $scope.dateValString = $filter('date')($scope.dateVal, 'mediumDate');
    

6

আমি নিম্নলিখিত নির্দেশাবলী ব্যবহার করি যা আমাকে এবং বেশিরভাগ ব্যবহারকারীদের খুব খুশি করে! এটি পার্সিং এবং ফর্ম্যাট করার জন্য মুহুর্তটি ব্যবহার করে। এটিকে খানিকটা আগের মতো সানিশাহর মতো দেখাচ্ছে।

angular.module('app.directives')

.directive('appDatetime', function ($window) {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function (scope, element, attrs, ngModel) {
            var moment = $window.moment;

            ngModel.$formatters.push(formatter);
            ngModel.$parsers.push(parser);

            element.on('change', function (e) {
                var element = e.target;
                element.value = formatter(ngModel.$modelValue);
            });

            function parser(value) {
                var m = moment(value);
                var valid = m.isValid();
                ngModel.$setValidity('datetime', valid);
                if (valid) return m.valueOf();
                else return value;
            }

            function formatter(value) {
                var m = moment(value);
                var valid = m.isValid();
                if (valid) return m.format("LLLL");
                else return value;

            }

        } //link
    };

}); //appDatetime

আমার ফর্মটিতে আমি এটি ব্যবহার করি:

<label>begin: <input type="text" ng-model="doc.begin" app-datetime required /></label>
<label>end: <input type="text" ng-model="doc.end" app-datetime required /></label>

এই একটি টাইমস্ট্যাম্প (1970 সাল থেকে মিলিসেকেন্ড) বাঁধবে doc.beginএবং doc.end


4
এটা সত্য যে, এই লিঙ্কটি ফাংশন ভিতরে, উপেক্ষা করা সহজ ngModelনিয়ামক যুক্তি, না একটি সরাসরি নাম উল্লেখের জন্য আপনার কাস্টম আইডেন্টিফায়ার ngModel। এটি এমন একটি জায়গা যেখানে 'সিটিআরএল' বা 'নিয়ন্ত্রক' নামকরণের কনভেনশন জিনিসগুলিকে পরিষ্কার রাখে এবং বিভ্রান্তি এড়ায়।
এক্সএমএল

ধন্যবাদ! আমি এটি করার জন্য একটি দুর্দান্ত উপায়টির জন্য সারাদিন তাকিয়ে আছি। দুর্ভাগ্যক্রমে, বেশিরভাগ অন্যান্য ফিক্সগুলির মধ্যে বিশেষভাবে কৌণিকের জন্য লেখা ডেটপিকারে স্যুইচ করা জড়িত ছিল এবং এটি খুব বেশি কাজ ছিল।
জোশ মাউচ

আমি আপনার এবং @ সানিশাহর উত্তর উভয়ই চেষ্টা করেছিলাম, তবে তার কাজ হয়নি বলে মনে হয়েছে। নিশ্চিত কেন।
জোশ মাউচ

3

আগ্রহী প্রত্যেকের জন্য কৌণিক 2 + এ:

<input type="text" placeholder="My Date" [ngModel]="myDate | date: 'longDate'">

ডেট পাইপ কৌণিক মধ্যে ফিল্টার ধরণের ।


ডাং, আমি লিগ্যাসি অ্যাঙ্গুলারজেএস-এ আটকে আছি যা আমাকে কাজ করতে বাধ্য করেছে, এবং আমি এটি ঘৃণা করি! আশা করি আমার সাথে কাজ করার জন্য উপরেরটি ছিল।
জর্দান

এটি কেবল লোকজনকে জ্বালাতন করছে এবং এঙ্গুলার 2 + ব্যবহার করে তাদের ট্রিক করছে। ইয়াক! AngularJs সম্পূর্ণ বোমা। কেউ কেন এর মতো সরল সমাধান চাইবে।
নেবুলোসার

2

আমি সার্ভারটি পরিবর্তন না করেই তারিখটি ফেরত দেওয়া পছন্দ করি এবং জাভাস্ক্রিপ্টটি দেখে ম্যাসেজ করা। আমার এপিআই এসকিউএল সার্ভার থেকে "এমএম / ডিডি / ওয়াইওয়াই এইচ: মিমি: এসএস" প্রদান করে।

রিসোর্স

angular.module('myApp').factory('myResource',
    function($resource) {
        return $resource('api/myRestEndpoint/', null,
        {
            'GET': { method: 'GET' },
            'QUERY': { method: 'GET', isArray: true },
            'POST': { method: 'POST' },
            'PUT': { method: 'PUT' },
            'DELETE': { method: 'DELETE' }
        });
    }
);

নিয়ামক

var getHttpJson = function () {
    return myResource.GET().$promise.then(
        function (response) {

            if (response.myDateExample) {
                response.myDateExample = $filter('date')(new Date(response.myDateExample), 'M/d/yyyy');
            };

            $scope.myModel= response;
        },
        function (response) {
            console.log(response.data);
        }
    );
};

মাইডেট বৈধকরণের নির্দেশিকা

angular.module('myApp').directive('myDate',
    function($window) {
        return {
            require: 'ngModel',
            link: function(scope, element, attrs, ngModel) {

                var moment = $window.moment;

                var acceptableFormats = ['M/D/YYYY', 'M-D-YYYY'];

                function isDate(value) {

                    var m = moment(value, acceptableFormats, true);

                    var isValid = m.isValid();

                    //console.log(value);
                    //console.log(isValid);

                    return isValid;

                };

                ngModel.$parsers.push(function(value) {

                    if (!value || value.length === 0) {
                         return value;
                    };

                    if (isDate(value)) {
                        ngModel.$setValidity('myDate', true);
                    } else {
                        ngModel.$setValidity('myDate', false);
                    }

                    return value;

                });

            }
        }
    }
);

এইচটিএমএল

<div class="form-group">
    <label for="myDateExample">My Date Example</label>
    <input id="myDateExample"
           name="myDateExample"
           class="form-control"
           required=""
           my-date
           maxlength="50"
           ng-model="myModel.myDateExample"
           type="text" />
    <div ng-messages="myForm.myDateExample.$error" ng-if="myForm.$submitted || myForm.myDateExample.$touched" class="errors">
        <div ng-messages-include="template/validation/messages.html"></div>
    </div>
</div>

টেমপ্লেট / বৈধতা / ম্যাসেজ। html

<div ng-message="required">Required Field</div>
<div ng-message="number">Must be a number</div>
<div ng-message="email">Must be a valid email address</div>
<div ng-message="minlength">The data entered is too short</div>
<div ng-message="maxlength">The data entered is too long</div>
<div ng-message="myDate">Must be a valid date</div>

1

Angularjs ui বুটস্ট্র্যাপ আপনি Angularjs ui বুটস্ট্র্যাপ ব্যবহার করতে পারেন, এটি তারিখের বৈধতাও সরবরাহ করে

<input type="text"  class="form-control" 
datepicker-popup="{{format}}" ng-model="dt" is-open="opened" 
min-date="minDate" max-date="'2015-06-22'"  datepickeroptions="dateOptions"
date-disabled="disabled(date, mode)" ng-required="true"> 



নিয়ামক আপনি তারিখ ফিল্টার হিসাবে তারিখটি প্রদর্শন করতে চান যে বিন্যাস নির্দিষ্ট করতে পারেন

$ স্কোপ.ফর্ম্যাটস = ['ডিডি-এমএমএমএম-ইয়াই', 'ইয়াই / এমএম / ডিডি', 'ডিডি.এম.এম.ইউইআই', 'শর্ট ডেট'];


আপনাকে কেবল একক ইনপুট ক্ষেত্রের জন্য নির্দেশনা প্রয়োগ করতে হবে না
পি.জায়াস্রি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.