如何使用嵌套数据从网格上设置表单上的组合框值? Extjs 4.2 Mvc

时间:2013-05-14 13:30:12

标签: extjs extjs-mvc extjs4.2

我有一个网格,弹出一个带有组合框的编辑表单。在我显示视图之前,我加载了组合框存储。然后我使用form.loadRecord(record);设置表单的值。这会加载主记录。但是如何加载与组合框关联的关联数据值,以便正确设置组合框的值。

  1. 我知道我可以手动使用setValue,但我想我可以通过加载表单来处理。

  2. 如果我的表单有3个字段,请说出firstName lastName,然后是ContactType的组合框。 firstName和lastName位于我的主记录中,ContactType是关联记录。如果我更改字段lastName或firstName中的值,则会检测到更改并将记录标记为脏。如果我更改组合框值,则记录不会标记为脏。我猜是因为他们是两个不同的模特。如何使它成为一个记录。我认为在一个表格中有一个组合框,其值从网格中的记录设置是常见的,但我找不到任何最佳方法来实现这一点。

  3. 这是一些代码。

    我的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)是关联数据的getter。我能够获取相关数据,但不知道如何设置组合框中的值或如何使其作为一个记录并自动检测更改。

    我的联系人型号

    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字段添加到Contact模型,然后数据应该在同一记录中,并且更改跟踪将起作用。但这似乎与MVC模式相反,并且与协会的原因背道而驰。

    3. 你们如何处理这种情况,任何例子都会很棒!

      谢谢, 丹

1 个答案:

答案 0 :(得分:0)

如果您的表单正确加载了值,那么您需要做的就是:

Extjs4, How to set displayField in combo editor?