AngularJS - jQuery UI - binding issue

后端 未结 7 1560
盖世英雄少女心
盖世英雄少女心 2021-01-02 10:14

I am currently porting a large application over to a HTML5 based web app - I have started building the app in AngularJS and enjoying the power of the AngularJS framework - I

7条回答
  •  借酒劲吻你
    2021-01-02 11:18

    The angular-ui datepicker wasn't working with Angular 1.0.0, so I rewrote it. My fork gives you the ability to set how the date is formatted inside the input and how it gets saved back to the model.

    Code: https://gist.github.com/2967979 jsFiddle: http://jsfiddle.net/m8L8Y/8/ (It's missing jquery-ui styles but works just the same)


    // Code inspired by angular-ui https://github.com/angular-ui/angular-ui/blob/master/modules/directives/date/src/date.js
    /*
    Features:
    * via the ui-date attribute:
        * Ability to say how model is parsed into a date object
        * Ability to say how input's value is parsed into a date object
        * Ability to say how a date object is saved to the model
        * Ability to say how a date object is displayed in the input
    * via the ui-date-picker attribute
        * Ability to directly configure the jQuery-ui datepicker
    */
    
    
    angular.module('ui.directives', [])
        .directive('uiDate', function () {
            return {
                require: '?ngModel',
                //scope: {},
                link: function ($scope, element, attrs, ngModel) {
                    // Date Handling Functions
                    var dateHandler = $.extend({ model: {}, view: {} }, $scope.$eval(attrs.uiDate));
    
                    // This will attempt to use preferredParser to parse a date.
                    function defaultDateParse(date, preferredParser) {
                        if (!preferredParser)
                            return new Date(date);
                        return preferredParser(date);
                    }
    
                    // This will attempt to use preferredFormatter to format a date, otherwise use 'mm/dd/yy'.
                    function defaultDateFormatter(date, preferredFormatter) {
                        if (!preferredFormatter)
                            preferredFormatter = "mm/dd/yy";
    
                        if (typeof preferredFormatter == 'string')
                            return $.datepicker.formatDate(preferredFormatter, date);
                        else
                            return preferredFormatter(date);
                    }
    
                    // Functions for Parsing & Formatting on the Model & View
                    function parseDateFromModel(date) {
                        return defaultDateParse(date, dateHandler.model.parse)
                    }
                    function parseDateFromView(date) {
                        return defaultDateParse(date, dateHandler.view.parse)
                    }
                    function formatDateForModel(date) {
                        return defaultDateFormatter(date, dateHandler.model.format)
                    }
                    function formatDateForView(date) {
                        return defaultDateFormatter(date, dateHandler.view.format)
                    }
    
                    var defaultDateViewFormat = (
                        typeof dateHandler.view.format == 'string'
                        ? dateHandler.view.format
                        : 'mm/dd/yy'
                    )
    
                    // Initialize the jQuery-ui datePicker
                    var datePickerSettings = $.extend({ dateFormat: defaultDateViewFormat }, $scope.$eval(attrs.uiDatePicker))
                    var oldOnSelect = datePickerSettings.onSelect;
                    datePickerSettings.onSelect = function (dateVal) {
                        $scope.$apply(function () {
                            element.focus().val(dateVal);
                            updateModel();
                        })
                        if (oldOnSelect)
                            oldOnSelect.apply(this, arguments)
                    }
    
                    element.datepicker(datePickerSettings);
    
                    if (ngModel) {
                        // Specify how UI should be updated
                        ngModel.$render = function () {
                            element.val(ngModel.$viewValue || '');
                        };
    
                        // Listen for change events to enable binding
                        element.bind('blur keyup change', function () {
                            $scope.$apply(updateModel);
                        });
    
                        // Write data to the model
                        function updateModel() {
                            ngModel.$setViewValue(element.val());
                        }
    
                        // Convert the model into a string value
                        ngModel.$formatters.push(function (v) {
                            if (v != "" && v != null)
                                return formatDateForView(parseDateFromModel(v));
                            return null;
                        });
    
                        // Convert the string value into the model
                        ngModel.$parsers.push(function (v) {
                            if (v != "" && v != null)
                                return formatDateForModel(parseDateFromView(v))
                            return null;
                        });
                    }
    
                }
            };
        })
    

提交回复
热议问题