2

我想在 ExtJS 4.1 中创建一个 ItemSelector,但它们似乎没有两个列表的有效“标题”属性。这正是我想要的:

http://dev.sencha.com/deploy/ext-4.0.0/examples/multiselect/multiselect-demo.html

(注意两个标题:“available”和“selected”)

这是适用于 4.1 版本的“相同示例”:

http://dev.sencha.com/deploy/ext-4.1.0-gpl/examples/multiselect/multiselect-demo.html

这就是我下载 extJS 4.1 并从早期版本(4.0.7)添加 ItemSelector 和 MultiSelect 文件的原因。然后我复制了第一个示例中的几乎所有内容,但什么也没做,我也没有错误消息。

请告诉我我应该如何使这样的 ItemSelector 工作(最好使用 ext JS 4.1,因为它是最新版本,并且从不推荐使用的版本开始似乎是错误的,但在这一点上,任何可行的解决方案都可以,因为我用完了想法)。

这是我的html文件:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

在此处插入标题

<!-- ExtJS -->
<link rel="stylesheet" type="text/css" href="./resources/css/ext-all.css" />
<script type="text/javascript" src="bootstrap.js"></script>

<!-- Shared -->
<!--     <link rel="stylesheet" type="text/css" href="../shared/example.css" /> -->

<!-- Example -->
<script type="text/javascript" src="app.js"></script>
<link rel="stylesheet" type="text/css" href="./resources/css/ItemSelector.css" />

和 app.js 文件:

Ext.Loader.setConfig({enabled: true});
//Ext.Loader.setPath('Ext.ux', './ux');
Ext.require([
    'Ext.form.Panel',
    'Ext.ux.form.MultiSelect',
    'Ext.ux.form.ItemSelector'
]);

 Ext.onReady(function(){
console.log("ready");

/*
 * Ext.ux.form.MultiSelect Example Code
 */
var msForm = Ext.widget('form', {
    title: 'MultiSelect Test',
    width: 400,
    bodyPadding: 10,
    renderTo: 'multiselect',
    items:[{
        anchor: '100%',
        xtype: 'multiselect',
        msgTarget: 'side',
        fieldLabel: 'Multiselect',
        name: 'multiselect',

        allowBlank: false,
        // minSelections: 2,
        // maxSelections: 3,

        store: [[123,'One Hundred Twenty Three'],
                ['1', 'One'], ['2', 'Two'], ['3', 'Three'], ['4', 'Four'], ['5', 'Five'],
                ['6', 'Six'], ['7', 'Seven'], ['8', 'Eight'], ['9', 'Nine']],

        value: ['3', '4', '6'],

        ddReorder: true
    }],

    tbar:[{
        text: 'Options',
        menu: [{
            text: 'Set value (2,3)',
            handler: function(){
                msForm.getForm().findField('multiselect').setValue(['2', '3']);
            }
        },{
            text: 'Toggle enabled',
            handler: function(){
                var m = msForm.getForm().findField('multiselect');
                if (!m.disabled) {
                    m.disable();
                } else {
                    m.enable();
                }
            }
        },{
            text: 'Toggle delimiter',
            handler: function() {
                var m = msForm.getForm().findField('multiselect');
                if (m.delimiter) {
                    m.delimiter = null;
                    Ext.Msg.alert('Delimiter Changed', 'The delimiter is now set to <b>null</b>. Click Save to ' +
                                  'see that values are now submitted as separate parameters.');
                } else {
                    m.delimiter = ',';
                    Ext.Msg.alert('Delimiter Changed', 'The delimiter is now set to <b>","</b>. Click Save to ' +
                                  'see that values are now submitted as a single parameter separated by the delimiter.');
                }
            }
        }]
    }],

    buttons: [{
        text: 'Clear',
        handler: function(){
            var field = msForm.getForm().findField('multiselect');
            if (!field.readOnly && !field.disabled) {
                field.clearValue();
            }
        }
    }, {
        text: 'Reset',
        handler: function() {
            msForm.getForm().reset();
        }
    }, {
        text: 'Save',
        handler: function(){
            if(msForm.getForm().isValid()){
                Ext.Msg.alert('Submitted Values', 'The following will be sent to the server: <br />'+
                    msForm.getForm().getValues(true));
            }
        }
    }]
});

console.log(msForm);


var ds = Ext.create('Ext.data.ArrayStore', {
    data: [[123,'One Hundred Twenty Three'],
        ['1', 'One'], ['2', 'Two'], ['3', 'Three'], ['4', 'Four'], ['5', 'Five'],
        ['6', 'Six'], ['7', 'Seven'], ['8', 'Eight'], ['9', 'Nine']],
    fields: ['value','text'],
    sortInfo: {
        field: 'value',
        direction: 'ASC'
    }
});

/*
 * Ext.ux.form.ItemSelector Example Code
 */
var isForm = Ext.widget('form', {
    title: 'ItemSelector Test',
    width: 700,
    bodyPadding: 10,
    renderTo: 'itemselector',

    tbar:[{
        text: 'Options',
        menu: [{
            text: 'Set value (2,3)',
            handler: function(){
                isForm.getForm().findField('itemselector').setValue(['2', '3']);
            }
        },{
            text: 'Toggle enabled',
            handler: function(){
                var m = isForm.getForm().findField('itemselector');
                if (!m.disabled) {
                    m.disable();
                } else {
                    m.enable();
                }
            }
        },{
            text: 'Toggle delimiter',
            handler: function() {
                var m = isForm.getForm().findField('itemselector');
                if (m.delimiter) {
                    m.delimiter = null;
                    Ext.Msg.alert('Delimiter Changed', 'The delimiter is now set to <b>null</b>. Click Save to ' +
                                  'see that values are now submitted as separate parameters.');
                } else {
                    m.delimiter = ',';
                    Ext.Msg.alert('Delimiter Changed', 'The delimiter is now set to <b>","</b>. Click Save to ' +
                                  'see that values are now submitted as a single parameter separated by the delimiter.');
                }
            }
        }]
    }],

    items:[{
        xtype: 'itemselector',
        name: 'itemselector',
        anchor: '100%',
        fieldLabel: 'ItemSelector',
        imagePath: '../ux/images/',

        store: ds,
        displayField: 'text',
        valueField: 'value',
        value: ['3', '4', '6'],

        allowBlank: false,
        // minSelections: 2,
        // maxSelections: 3,
        msgTarget: 'side'
    }],

    buttons: [{
        text: 'Clear',
        handler: function(){
            var field = isForm.getForm().findField('itemselector');
            if (!field.readOnly && !field.disabled) {
                field.clearValue();
            }
        }
    }, {
        text: 'Reset',
        handler: function() {
            isForm.getForm().reset();
        }
    }, {
        text: 'Save',
        handler: function(){
            if(isForm.getForm().isValid()){
                Ext.Msg.alert('Submitted Values', 'The following will be sent to the server: <br />'+
                    isForm.getForm().getValues(true));
            }
        }
    }]
});

});

最后,这是我的文件夹结构:

-app.js
-bootstrap.js
-ext-all-debug.js
-NewFile.html
-ux
   -form
         -ItemSelector.js
         -MultiSelector.js
         -layout
              -ItemSelector.js
              -MultiSelect.js
-resources
   -css
         -ext-all.css
         -ItemSelector.css
4

4 回答 4

3
items:[{
    xtype: 'itemselector',
    name: 'itemselector',
    anchor: '100%',
    fieldLabel: 'ItemSelector',
    imagePath: '../ux/images/',

    store: ds,
    displayField: 'text',
    valueField: 'value',
    value: ['3', '4', '6'],

    allowBlank: false,
    // minSelections: 2,
    // maxSelections: 3,
    fromTitle : 'Available'
    toTitle : 'Selected'
    msgTarget: 'side'
}],
于 2012-12-12T11:39:43.463 回答
1

这是一个工作示例MultiSelect & ItemSelector - 4.1

确保您的 和 版本Ext.ux.form.ItemSelector与源Ext.ux.form.MultiSelect中的版本相同extjs 4.1(您可以在extjs-4.1.1/examples/ux/form目录中找到)。

我有同样的问题和更新MultiSelect.jsItemSelector.js解决了我的问题。

于 2012-08-08T15:53:23.487 回答
0

有一些版本的 Extjs 有 Itemselector 的错误。这是相当容易克服的。
1. 转到您的 Itemselector.js 文件并找到 setupItems 函数。
2. 该函数使用createList() 函数创建FromField 和ToField。
3. 函数重载:创建另一个函数,就像 createList() 一样,并传递一个参数(这是您要设置的标题),(例如:createList(param))
4. 在 createList(param) 函数中,只需添加标题:参数
5. 现在在 setupItems 函数中将 createList() 替换为 createList('Avaiable') 和 createList('Selected')。
6. 你完成了。

示例代码:

createList: function(param){
    var me = this;
    return Ext.create('Ext.ux.form.MultiSelect', {
            submitValue: false,
            flex: 1,
            dragGroup: me.ddGroup,
            dropGroup: me.ddGroup,
            store: {
                model: me.store.model,
                    data: []
            },
            title: param,
            displayField: me.displayField,
            disabled: me.disabled,
            listeners: {
                boundList: {
                        scope: me,
                        itemdblclick: me.onItemDblClick,
                        drop: me.syncValue  
            }
            }
    });
},

setupItems: function() {
        var me = this;

        me.fromField = me.createList('Available');
        me.toField = me.createList('Selected');

        // add everything to the from field at the start
        me.fromField.store.add(me.store.getRange());

        return {
            layout: {
                type: 'hbox',
                align: 'stretch'
            },
            items: [
                me.fromField,
                {
                    xtype: 'container',
                    margins: '0 4',
                    width: 22,
                    layout: {
                        type: 'vbox',
                        pack: 'center'
                    },
                    items: me.createButtons()
                },
                me.toField
            ]
        };
    },

谢谢。

于 2014-09-20T12:45:50.123 回答
0

为了让它工作,你可以在你的应用程序代码执行之前放入这些覆盖。(这需要在 4.1 中运行才能在 4.0 中使用 Ext.override 运行)

Ext.define('Ext.ux.form.override.MultiSelect', {
    override : 'Ext.ux.form.MultiSelect',

    setupItems : function() {
        var me = this;
        me.boundList = Ext.create('Ext.view.BoundList', {
            deferInitialRefresh : false,
            multiSelect : true,
            store : me.store,
            displayField : me.displayField,
            disabled : me.disabled
        });
        me.boundList.getSelectionModel().on('selectionchange', me.onSelectChange, me);
        //START OVERRIDE
        this.selectedPanel = new Ext.panel.Panel({
            bodyStyle : 'border: 0;',
            layout : 'fit',
            title : me.title,
            tbar : me.tbar,
            items : me.boundList
        });

        return {
            xtype : 'container',
            layout : 'fit',
            items : this.selectedPanel
        };
    }
});

Ext.define('Ext.ux.form.override.ItemSelector', {
    override : 'Ext.ux.form.ItemSelector',

    fromTitle : 'Available',
    toTitle : 'Selected',

    setupItems : function() {
        var items = this.callParent();

        this.fromField.selectedPanel.setTitle(this.fromTitle);
        this.toField.selectedPanel.setTitle(this.toTitle);

        return items;
    }
})

我建议不要在生产中使用这个组件。如您所知,Ext 不支持它,而且它很容易发生变化。代码也很糟糕,这两个组件不能更紧密地耦合。

于 2012-06-01T01:01:58.240 回答