Как поместить повторяющийся код из литерала объекта в функцию и вызвать его с параметрами? - PullRequest
0 голосов
/ 14 марта 2011

У меня есть следующий литерал объекта , отправляемый на Ext JS Ext.FormPanel.

Эта форма имеет ряд полей формы , например, "Контакт с клиентом""," Причина контакта "и т. Д.

Каждый из них должен иметь тип раскрывающийся список вместо простого текстового поля , как они есть сейчас.

Я преобразовал первое поле в раскрывающийся список:

var form_customer_contact = new Ext.FormPanel({
    frame:true,
    labelWidth: 110,
    labelAlign: 'right',
    bodyStyle:'padding:0',
    width: 300,
    height: 600,
    autoScroll: true,
    itemCls: 'form_row',
    defaultType: 'displayfield',
    items: [{
            fieldLabel: 'Customer Contact',
            name: 'customerContact',
            allowBlank:false,
            value: 'Mr. Smith'
        },{
            fieldLabel: 'Reason for Contact',
            width:          150,
            xtype:          'combo',
            mode:           'local',
            value:          '1',
            triggerAction:  'all',
            forceSelection: true,
            editable:       false,
            fieldLabel:     'Produkt',
            name:           'reason',
            hiddenName:     'reason',
            displayField:   'name',
            valueField:     'value',
            store:          new Ext.data.JsonStore({
                fields : ['name', 'value'],
                data   : [
                    {name : 'data correction',   value: '1'},
                    {name : 'new contact',  value: '2'},
                    {name : 'missing information', value: '3'}
                ]
            })
        }, {
            fieldLabel: 'Communication',
            name: 'communication',
            value: 'test'
        }, {
            fieldLabel: 'Related Order',
            name: 'relatedOrder',
            value: 'test'
        }, {
            fieldLabel: 'Date/Time',
            name: 'dateTime',
            value: 'test'
        }, {
            fieldLabel: 'Notes',
            name: 'notes',
            value: 'test'
        }
    ]
});

Теперь все остальные поля также необходимо преобразовать в раскрывающийся список, но посколькупримерно 80% кода останется прежним каждый, я хочу просто вызвать функцию , например, вот так:

getField('Reason for Contact', 'reason', {'data correction', 'new contact', 'missing information'})
getField('Communication', 'communication', {'telephone', 'fax', 'email'})

Что такоелучший способ создать функцию или объект в Javascript, который можно вызывать, как описано выше, чтобы уменьшить раздувание кода в этом примере?

Ответы [ 2 ]

2 голосов
/ 15 марта 2011

Вы можете создать фабричную функцию для этого следующим образом:

var createCombo = function(label, name, values) {
    var i, data = [];

    for(i = 0; i < values.length; i++) {
        data.push({ name: values[i], value: i+1+'' });
    }   

    return new Ext.form.ComboBox({
        fieldLabel:     label,
        name:           name,
        width:          150,  
        mode:           'local',
        value:          '1',
        triggerAction:  'all',
        forceSelection: true,
        editable:       false,
        displayField:   'name',
        valueField:     'value',
        store:          new Ext.data.JsonStore({
            fields : ['name', 'value'],
            data   : data
        })            
    });
};

Тогда в вашем списке предметов назовите это так:

createCombo('Reason for Contact', 'reason', ['data correction', 'new contact', 'missing information'])
0 голосов
/ 14 марта 2011

Расширение повторно используемых компонентов путем создания xtypes.http://www.sencha.com/learn/Manual:Component:Extending_Ext_Components

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...