Моята джаджа Dijit DateTimeCombo не изпраща избрана стойност при подаване на формуляр

трябва да създам джаджа на Dojo, която позволява на потребителите да определят дата и час. намерих примерно изпълнение, прикачено към запис в инструмента за проследяване на грешки на Dojo. Изглежда добре и най-вече работи, но когато изпратя формуляра, стойността, изпратена от клиента, не е избраната от потребителя стойност, а стойността, изпратена от сървъра.

Какви промени трябва да направя, за да накарам джаджата да изпрати стойността за дата и час?

Примерно използване е за изобразяване на JSP с основни HTML тагове (форма и въвеждане), след това dojo.addOnLoad функция, която избира основните елементи по ID, добавя атрибут dojoType и dojo.parser.parse()-es страницата.

Благодаря предварително.

Уиджетът е реализиран в два файла. Приложението използва Dojo 1.3.

Файл 1: DateTimeCombo.js

dojo.provide("dojox.form.DateTimeCombo");

dojo.require("dojox.form._DateTimeCombo");
dojo.require("dijit.form._DateTimeTextBox");

dojo.declare(
    "dojox.form.DateTimeCombo", 
    dijit.form._DateTimeTextBox,
    {
        baseClass: "dojoxformDateTimeCombo dijitTextBox",
        popupClass: "dojox.form._DateTimeCombo",
        pickerPostOpen: "pickerPostOpen_fn",        
        _selector: 'date',      
        constructor: function (argv) {},

        postMixInProperties: function()
        {               
            dojo.mixin(this.constraints, {
                /*
                datePattern: 'MM/dd/yyyy HH:mm:ss',  
                timePattern: 'HH:mm:ss',
                */
                datePattern: 'MM/dd/yyyy HH:mm',
                timePattern: 'HH:mm',

                clickableIncrement:'T00:15:00',
                visibleIncrement:'T00:15:00', 
                visibleRange:'T01:00:00'
            });
            this.inherited(arguments);
        },

    _open: function ()
    {
        this.inherited(arguments);
        if (this._picker!==null && (this.pickerPostOpen!==null && this.pickerPostOpen!==""))
        {
            if (this._picker.pickerPostOpen_fn!==null)
            {
                this._picker.pickerPostOpen_fn(this);
            }
        }
    }       

    }
);

Файл 2: _DateTimeCombo.js

dojo.provide("dojox.form._DateTimeCombo");

dojo.require("dojo.date.stamp");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.require("dijit._Calendar");
dojo.require("dijit.form.TimeTextBox");
dojo.require("dijit.form.Button");

dojo.declare("dojox.form._DateTimeCombo",
    [dijit._Widget, dijit._Templated],
{

    // invoked only if time picker is empty 
    defaultTime: function () {
        var res= new Date();
        res.setHours(0,0,0);
        return res;
    },

    // id of this table below is the same as this.id
    templateString:
    "   <table  class=\"dojoxDateTimeCombo\" waiRole=\"presentation\">\
        <tr class=\"dojoxTDComboCalendarContainer\">\
        <td>\
            <center><input dojoAttachPoint=\"calendar\" dojoType=\"dijit._Calendar\"></input></center>\
        </td>\
        </tr>\
        <tr class=\"dojoxTDComboTimeTextBoxContainer\">\
        <td>\
            <center><input dojoAttachPoint=\"timePicker\" dojoType=\"dijit.form.TimeTextBox\"></input></center>\
        </td>\
        </tr>\
        <tr><td><center><button dojoAttachPoint=\"ctButton\" dojoType=\"dijit.form.Button\">Ok</button></center></td></tr>\
        </table>\
    ",

    widgetsInTemplate: true,

    constructor: function(arg) {},

    postMixInProperties: function() {       
        this.inherited(arguments);      
    },

    postCreate: function() {
        this.inherited(arguments);  
        this.connect(this.ctButton, "onClick", "_onValueSelected");
    },

    // initialize pickers to calendar value
    pickerPostOpen_fn: function (parent_inst) {
        var parent_value = parent_inst.attr('value');
        if (parent_value !== null) {
            this.setValue(parent_value);
        }
    },

    // expects a valid date object
    setValue: function(value) {
        if (value!==null) {
            this.calendar.attr('value', value);
            this.timePicker.attr('value', value);
        }       
    },

    // return a Date constructed date in calendar & time in time picker.
    getValue: function() {
        var value = this.calendar.attr('value');
        var result=value;       
        if (this.timePicker.value !== null) {
            if ((this.timePicker.value instanceof Date) === true) {
                result.setHours(this.timePicker.value.getHours(),
                this.timePicker.value.getMinutes(),
                this.timePicker.value.getSeconds());
                return result;
            }
        } else {
            var defTime=this.defaultTime();
            result.setHours(defTime.getHours(),
                defTime.getMinutes(),
                defTime.getSeconds());
            return result;                  
        }
    },

    _onValueSelected: function() {
        var value = this.getValue();
        this.onValueSelected(value);
    },

    onValueSelected: function(value) {}

});

person david bessire    schedule 19.05.2010    source източник


Отговори (2)


Изглежда, че искате да използвате getValue. Конвенцията сега е да се използва _getValueAttr и след това да се извика attr("value"), но мисля, че това започна в Dojo 1.4 и този код трябва да бъде пренесен, за да използва тези нови модели.

Не, тази стойност трябва да бъде Javascript Date обект, който най-добре би бил изпратен до сървъра с помощта на dojo.date.stamp.toISOString()

person peller    schedule 21.05.2010

Това започна да работи добре, след като добавих метод "serialize" към DateTimeCombo.js, който изгражда точно изходния формат, който искам.

Това ми се струва странно, тъй като вече има изпълнение на сериализиране в _DateTimeTextBox.js, което трябва да изведе стойността в необходимия ISO формат.

person davidbessire    schedule 21.05.2010