indrimuska / angular-moment-picker

Angular Moment Picker is an AngularJS directive for date and time picker using Moment.js.
http://indrimuska.github.io/angular-moment-picker/
MIT License
527 stars 229 forks source link

Ignoring model changes if model is set to string #305

Open easyest opened 3 years ago

easyest commented 3 years ago

Input:

                <input class="form-control"
                       name="MomentPicker"
                       ng-model="vm.testDateTime"
                       ng-model-options="{ updateOn: 'blur' }"
                       moment-picker="vm.testDateTime">

If model is set to string - it is ignored. See Plunkr

I have no TS coding experience, so I made changes to JS directly. See Plunkr

The change I made is adding one more watcher after the watcher if ($attrs['ngModel'] != $attrs['momentPicker']):

                $scope.$watch('model', function (newValue, oldValue) {
                    if (typeof newValue === "string") {
                        newValue = moment(newValue);
                    }
                    if (newValue !== oldValue)
                        utility_1.setValue(newValue, $scope, $ctrl, $attrs);
                });

You can check the exact change at this comit

easyest commented 3 years ago

With the additional watch shown above, there is a problem with validation - the value is not validated and is show invalid required even if set. The solution is to modify momentToValue method instead of adding a watch:

exports.momentToValue = function (momentObject, format) {
    if (typeof momentObject === "string") {
        momentObject = moment(momentObject);
    }
    if (!exports.isValidMoment(momentObject))
        return undefined;
    return !format ? momentObject.valueOf() : momentObject.format(format);
};