如何在具有嵌套数据的网格中设置组合框值? Extjs 4.2 Mvc

Posted

技术标签:

【中文标题】如何在具有嵌套数据的网格中设置组合框值? Extjs 4.2 Mvc【英文标题】:How to set combox value on form from grid with nested data? Extjs 4.2 Mvc 【发布时间】:2013-05-14 13:30:12 【问题描述】:

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

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

    如果我的表单有 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',]
);

    这是为包含嵌套数据的表单中的组合框设置值的正确方法吗?

    我是否应该不使用关联而只将所有字段放入我的联系人模型中,即将所有 ContactType 字段添加到联系人模型中,然后数据应该在同一记录中,并且更改跟踪将起作用。但这似乎与 MVC 模式背道而驰,与关联的原因背道而驰。

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

谢谢, 丹

【问题讨论】:

【参考方案1】:

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

Extjs4, How to set displayField in combo editor?

【讨论】:

感谢您的建议。我知道第一个 form.loadRecord(record);正在显示表单中的值,但是我不知道第二个 form.loadRecord(record.getContactType());正在工作,你怎么知道?据我了解,当我使用第二种形式时,加载数据 __KEY 应该与组合框数据 __KEY 匹配并设置值。由于前 2 个字段是 1 个商店,而组合框是另一个商店,因此仍然存在更改跟踪问题。谢谢 我认为您不想调用 loadRecord() 两次。调用一次,运行后设置组合初始值。 我按照你的建议做了。这确实有效,但它非常手动,似乎是错误的。但是好的,下一个主要关注点是更改跟踪。表单加载并正确设置组合框值后,如果我更改组合框值并单击保存,则不会发生任何事情,因为表单与主存储相关联,它不会认为任何字段都是脏的 form.loadRecord(record); var mykey = record.getContactType().data.__KEY combo.setValue(mykey) 我在 sencha 论坛上发现了这个帖子,一些用户需要手动处理相关数据,但现在看来这应该在框架中处理。 sencha.com/forum/…

以上是关于如何在具有嵌套数据的网格中设置组合框值? Extjs 4.2 Mvc的主要内容,如果未能解决你的问题,请参考以下文章

使用组合框值更改时的新存储值更新/刷新 dojo 数据网格

如何在 CSS 网格布局中设置列的最大宽度?

如何在 AngularJS 中设置嵌套视图?

基于另一个组合在 ExtJs 中的 EditableGrid 中设置组合框的存储

如何在剑道 UI 网格中设置多行列

在内部类中设置 WPF 文本框值