【问题标题】:ExtJS 4.2 - Dynamically Load Date Picker Value - Newbie QExtJS 4.2 - 动态加载日期选择器值 - 新手 Q
【发布时间】:2014-01-04 19:22:37
【问题描述】:

ExtJS 框架没有给出使用变量的明显方式。我正在尝试使用 disabledDates: 的数组动态加载日期选择器。我尝试了很多不同的方法,但总是归结为我尝试访问的任何变量都是未定义的。为 datepicker 动态加载配置的首选方法是什么?在控制器和组件之间使用变量的首选方法是什么?

我已将数组加载到我的控制器中。如何使用它在我的日期选择器配置上设置值?目前我正在对 dateArray 中的一些日期进行硬编码,并且它正在工作。我想动态加载它。

控制器:

Ext.define('AM.controller.Users', {
extend: 'Ext.app.Controller',
stores:['Users', 'dates'],
models:['User', 'date'],
views: ['user.List','user.Edit'],


init: function() {

Ext.getStore('dates').addListener('load',this.ondatesStoreLoad, this);


this.control(
   {


    'viewport > userlist':
    {
        itemdblclick: this.editUser,
    },


    'useredit button[action=save]':
    {
        click: this.updateUser
    }           



});

},


// ----------  handler Function declarations  -------------

ondatesStoreLoad: function(me,records,success)
{


// ------  Gets the dates from dates store and loads an array
var store = this.getStore('dates');
sendDataArray = [];

store.each(function(record){
var recordArray = [record.get("unix_time_stamp")];
sendDataArray.push(recordArray);
});         

// ------  Gets the dates from dates store and loads an array

},


editUser: function(grid, record)
{
var view = Ext.widget('useredit');
view.down('form').loadRecord(record);

},

updateUser: function(button)
{
var win    = button.up('window'),
    form   = win.down('form'),
    record = form.getRecord(),
    values = form.getValues();


record.set(values);
win.close();
    this.getUsersStore().sync();
}   
});

视口:

Ext.Loader.setConfig({enabled:true});

// This array is for testing.
dateArray = ["01/01/2014","01/06/2014","01/08/2014","01/20/2014"];


Ext.application({
requires: ['Ext.container.Viewport'],
name: 'AM',
appFolder: 'app',
controllers: ['Users'],

launch: function() {

    Ext.create('Ext.container.Viewport', {

    layout: 'border',

     items:
        [{

            region: 'center',
        title:'The Title',
            xtype: 'tabpanel', // TabPanel itself has no title
            activeTab: 0,      // First tab active by default

                items:
            [{xtype: 'userlist'}]
            },
            {
            region: 'west',
            layout:'fit',
            xtype: 'tabpanel',
            activetab:0,
            collapsible:false,
            split: false,
            title: 'The Title',

            width:178,
            maxWidth:400,
                height: 100,
                minHeight: 100,
            items:
            [{
                title: 'Tab 1',
                xtype:'panel',

                items:
                    [{
                    xtype: 'datepicker',
                    minDate: new Date('01/02/2014'),
                    maxDate: new Date(),
                    disabledDates:["^("+dateArray.join("|")+").*$"],
            }]
            }]
        });
    }
});

更新的控制器:

Ext.define('AM.controller.Users', {
extend: 'Ext.app.Controller',
stores:['Users', 'dates'],
models:['User', 'date'],
views: ['user.List','user.Edit'],


init: function() {

Ext.getStore('dates').addListener('load',this.ondatesStoreLoad, this);

    this.control(
    {

        'viewport > userlist':
        {
            itemdblclick: this.editUser,
        },

        'useredit button[action=save]':
        {
            click: this.updateUser
        }           

    });

},


// ----------  handler Function declarations  -------------

ondatesStoreLoad: function(me,records,success)
{

// ------  Gets the dates from dates store and loads an array
var store = this.getStore('dates');
sendDataArray = [];

store.each(function(record){
    var recordArray = [record.get("unix_time_stamp")];
    sendDataArray.push(recordArray);
});         


// ------  Set DatePicker here  --------//

var dtFld = Ext.ComponentQuery.query('#datePickerFld')[0];

dtFld.setDisabledDates(["^(?!"+sendDataArray.join("|")+").*$"]);
dtFld.setMaxDate(new Date());
dtFld.setMinDate(new Date('05/01/2013'));

},

editUser: function(grid, record)
{
    var view = Ext.widget('useredit');
    view.down('form').loadRecord(record);
},

updateUser: function(button)
{
    var win    = button.up('window'),
        form   = win.down('form'),
        record = form.getRecord(),
        values = form.getValues();

    record.set(values);
    win.close();
    this.getUsersStore().sync();
},

});

更新的视口:

Ext.Loader.setConfig({enabled:true});

Ext.application({
requires: ['Ext.container.Viewport'],
name: 'AM',
appFolder: 'app',
controllers: ['Users'],

launch: function() {

    Ext.create('Ext.container.Viewport', {
    layout: 'border',
    items:[{
            region: 'center',
            title:'The Title',
            xtype: 'tabpanel',
            activeTab: 0,
            items:[{
                    xtype: 'userlist',
                    listeners:
                    {
                        select: function(selModel, record, index, options)
                        {
                            // do something with the selected date
                            console.log('select');
                        },
                        add: function(selModel)
                        {
                            // do something with the selected date
                            console.log('add - init2.js');
                        },
                        afterrender:function(selModel)
                        {
                            // do something with the selected date
                            console.log('afterrender - userlist(init2.js)');
                        },
                        beforerender:function(selModel)
                        {
                            // do something with the selected date
                            console.log('beforerender - userlist(init2.js)');
                        }
                    }
                  }]
            },
            {
            region: 'west',
            layout:'fit',
            xtype: 'tabpanel',
            activetab:0,
            collapsible:false,
            split: false,
            title: 'The Title',
            width:178,
            maxWidth:400,
            height: 100,
            minHeight: 100,
            items:[{
                    title: 'Tab 1',
                    xtype:'panel',
                    items:
                        [{
                        xtype: 'datepicker',
                        itemId:'datePickerFld',
                        listeners:{
                            beforerender: function(){
                                console.log('datepicker - beforerender(init2.js)');
                                var store = Ext.getStore('dates');
                                store.load({callback: function(){
                                console.log('datepicker - callback(init2.js');
                                console.log(store.data.items[999].data.recip_email);
                                console.log(store.data.items[999].data.unix_time_stamp);
                                }
                                })
                            }
                        },

                        handler: function(picker, date)
                            {
                            // do something with the selected date
                            console.log('date picker example in init2.js' + Ext.Date.format(date,'m/d/Y'));

                            // get store by unique storeId
                            var store = Ext.getStore('Users');

                            // clear current filters
                             store.clearFilter(true);

                            // filter store
                              Ext.encode(store.filter("unix_time_stamp", Ext.Date.format(date,'m/d/Y')));

                            store.load();
                            store.sync();
                            }
                        }]
            },
            {
                title: 'Tab 2',
                html: 'ers may be added dynamically  - Others may be added dynamically',
            }]

         }]
    });
}
});

【问题讨论】:

    标签: variables datepicker extjs4.2


    【解决方案1】:

    您需要使用datepicker 方法setDisabledDates(),它接受一个日期字符串数组。如果您从商店加载中动态获取日期,那么您将需要查询您的组件并在商店加载中执行该方法。

    您可以在指定的日期选择器中添加itemId,以便于查询。

                [{
                        xtype: 'datepicker',
                        minDate: new Date('01/02/2014'),
                        maxDate: new Date(),
                        disabledDates:["^("+dateArray.join("|")+").*$"],
                        itemId:'datePickerFld'
                }]
    

    然后在您的商店加载中查询并设置禁用日期...

    var dtFld = Ext.ComponentQuery.query('#datePickerFld')[0];
    dtFld.setDisabledDates(disabledDatesArray);
    

    【讨论】:

    • 非常感谢您...我做了您建议和测试的更改。它起作用了,所以开始清理我的代码。我很惊讶地看到其他东西开始工作(比如我的过滤器)只是通过清理我拥有的东西。我什至没有意识到它不起作用,直到我看到它的行为有所不同。只是表明如果没有你的帮助,我会浪费多少时间并继续浪费。最后一个问题。我的日期选择器加载所有日期,然后禁用正确的日期。无论如何让它在禁用日期初始化之前不显示日期选择器?实际上它正在一个一个地加载所有组件
    • 我添加了更新后的代码。它显示了我作为占位符添加的一些其他内容,用于在我的学习曲线期间我的听众和处理程序显示日志记录。 Anyrate,这是相同的代码,只是看起来与我最初的帖子有点不同。
    • 这里有几个选项,具体取决于您正在寻找的 ui 体验。一个选项,您可以在配置中将这些组件默认为 disabled,然后在将数据加载到存储加载事件。
    • 在上面的 UPDATED VIEWPORT 中,我会禁用每个区域的标签面板吗?然后,执行相同的操作并为两个选项卡面板添加 itemId,以便我启用它们与我认为的 datepicker disableDates 相同?
    • 如果我禁用它是灰色的,正如你所期望的那样禁用。有没有办法在加载所有内容之前不显示任何内容?这也是你指的ui体验?
    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多