Как установить значение выпадающего списка в форме из сетки с вложенными данными? Extjs 4.2 MVC

У меня есть сетка, в которой появляется форма редактирования с полем со списком. Прежде чем показать представление, я загружаю хранилище со списком. Затем я устанавливаю значения формы, используя form.loadRecord(record);. Это нормально загружает основную запись. Но как мне загрузить связанное значение данных, привязанное к полю со списком, чтобы значение поля со списком было установлено правильно.

  1. Я знаю, что могу использовать setValue вручную, но, думаю, я думал, что это можно сделать с помощью формы загрузки.

  2. Если в моей форме 3 поля, скажем, firstName lastName, а затем поле со списком ContactType. FirstName и lastName находятся в моей основной записи, а ContactType является связанной записью. Если я изменяю значения в полях lastName или firstName, изменение обнаруживается, и запись помечается как грязная. Если я изменю значение поля со списком, запись не будет помечена как грязная. Я предполагаю, потому что это две разные модели. Как сделать это одной записью. Я бы подумал, что поле со списком в форме, значения которого установлены из записи в сетке, является обычным явлением, но я не могу найти примеров наилучшего способа сделать это.

Вот некоторый код.

Мой json выглядит так. Основная запись имеет firstName lastName hasOne связанная запись — ContactType

{
   "__ENTITIES":[
      {
         "__KEY":"289",
         "__STAMP":12,
         "ID":289,
         "firstName":"a",
         "middleName":"",
         "lastName":"asd",
         "ContactType":{
            "__KEY":"2",
            "__STAMP":4,
            "ID":2,
            "name":"Home"
         }
      }
   ]
}

Функция списка контроллеров, функция редактирования и функция обновления, срабатывает при нажатии строки сетки

list: function () {
       var mystore = this.getStore('Contacts')
       mystore.proxy.extraParams = { $expand: 'ContactType'};
       mystore.load({
        params: {
        },
        callback: function(r,options,success) {
     //       debugger;
        } //callback
    }); //store.load

        editContact: function (grid, record) {     
        //load store for combobox
        var store = this.getStore('ContactTypes');
        store.load({
            params: {
            },
            callback: function(r,options,success) {
        //    debugger;
            } //callback
        }); //store.load

        var view = Ext.widget('contactsedit');
        var form =  view.down('form')
        //load primary record
        form.loadRecord(record);
        //load associated record
        form.loadRecord(record.getContactType());

 updateContact: function (button) {
    var win = button.up('window'),
        form = win.down('form'),
        record = form.getRecord(),
        values = form.getValues(),
        store =  this.getStore('Contacts')
    if (form.getForm().isValid()) {
        if (this.addnew == true) {
            store.add(values);
        } else {
            record.set(values);
        }
        store.sync();
        win.close();
    }
}

loadRecord(record.getContactType) является получателем связанных данных. Я могу получить связанные данные, но не знаю, как заставить его установить значение в поле со списком или как заставить его действовать как одна запись и автоматически обнаруживать изменения.

Мои контакты Модель

Ext.define('SimplyFundraising.model.Contact', {
    extend : 'Wakanda.model',
    requires:[
        'SimplyFundraising.model.ContactType'
    ],
    fields: ['firstName', 'middleName','lastName','ContactType.name'],
    associations: [
        {
            type: 'hasOne',
            model: 'SimplyFundraising.model.ContactType',
            name: 'ContactTypes',
            getterName: 'getContactType',
            associationKey: 'ContactType'

        }
    ]
});

Модель ContactType

Ext.define('SimplyFundraising.model.ContactType', {
    extend : 'Wakanda.model',
    fields: ['__KEY','name',]
});
  1. Это правильный способ установить значение для поля со списком в форме с вложенными данными?

  2. Если я не использую ассоциации и просто помещаю все поля в свою модель контактов, то есть добавляю все поля ContactType в модель контактов, тогда данные должны быть в одной записи, и отслеживание изменений будет работать. Но это кажется противоречащим шаблону MVC и основанию для ассоциаций.

Как вы, ребята, справляетесь с этим сценарием, любые примеры были бы замечательными!

Спасибо, Дэн


person dan    schedule 14.05.2013    source источник


Ответы (1)


если ваша форма правильно загружает значения, то все, что вам нужно сделать, это:

Extjs4, как установить displayField в комбинированном редакторе?

person Neil McGuigan    schedule 14.05.2013
comment
Спасибо за предложение. Я знаю, что первая форма form.loadRecord(record); работает, поскольку значения в форме отображаются, однако я не знаю, является ли второй form.loadRecord(record.getContactType()); работает, как сказать? Насколько я понимаю, когда я использую второй form.load, данные __KEY должны совпадать с данными поля со списком __KEY и устанавливать значение. Также все еще есть проблема с отслеживанием изменений, поскольку первые 2 поля - это 1 магазин, а поле со списком - другое хранилище. Спасибо - person dan; 15.05.2013
comment
Я не думаю, что вы хотите вызывать loadRecord() дважды. Вызовите его один раз, а после запуска установите начальное значение комбинации. - person Neil McGuigan; 15.05.2013
comment
Я сделал, как вы предложили. Это работает, но это очень ручное, просто кажется неправильным. Но хорошо, следующая главная проблема — отслеживание изменений. После загрузки формы и правильного значения поля со списком, если я изменю значение поля со списком и нажму «Сохранить», ничего не произойдет, потому что форма привязана к основному хранилищу, она не считает, что какие-либо поля являются грязными form.loadRecord(record); var mykey = запись.getContactType().data.__KEY combo.setValue(mykey) - person dan; 15.05.2013