Javascript Extjs 4 gridrow在模型保存后为空

Javascript Extjs 4 gridrow在模型保存后为空,javascript,extjs,extjs4,Javascript,Extjs,Extjs4,我有两个网格,按手风琴布局划分。它们基本上显示了相同类型的数据,因此分组网格应该可以做到这一点,但是这种方式看起来非常好,到目前为止也很好 网格左侧有一个表单面板,用于编辑网格记录,当我单击网格中的记录时,相应的数据将显示在表单中。我可以编辑数据,但当我单击“保存”按钮(该按钮触发“model”.save()操作)时,相关网格行将变为空白,并显示一个脏标志。我检查了模型,“data”属性不包含任何数据,但包含id,数据存在于“modified”属性中 我了解到红色脏标志意味着数据不会持久保存在后

我有两个网格,按手风琴布局划分。它们基本上显示了相同类型的数据,因此分组网格应该可以做到这一点,但是这种方式看起来非常好,到目前为止也很好

网格左侧有一个表单面板,用于编辑网格记录,当我单击网格中的记录时,相应的数据将显示在表单中。我可以编辑数据,但当我单击“保存”按钮(该按钮触发“model”.save()操作)时,相关网格行将变为空白,并显示一个脏标志。我检查了模型,“data”属性不包含任何数据,但包含id,数据存在于“modified”属性中

我了解到红色脏标志意味着数据不会持久保存在后端,但在本例中是这样的。请求返回的状态代码为200,success:true

来自控制器的onSave方法:

onSave : function() {
    // Get reference to the form
    var stepForm = this.getStepForm();

    this.activeRecord.set( stepForm.getForm().getValues() );

    this.activeRecord.save();

    console.log( this.activeRecord );
}
步骤存储:

Ext.define( 'Bedrijfsplan.store.Steps', {
    extend : 'Ext.data.Store',

    require : 'Bedrijfsplan.model.Step',

    model : 'Bedrijfsplan.model.Step',

    autoSync : true,

    proxy : {
        type : 'rest',

        url : 'steps',

        reader : {
            type : 'json',

            root : 'steps'
        },

        writer : {
            type : 'json',

            writeAllFields : false,

            root : 'steps'
        }
    }
} );
步骤模型:

Ext.define( 'Bedrijfsplan.model.Step', {
    extend : 'Ext.data.Model',

    fields : [ 'id', 'section_id', 'title', 'information', 'content', 'feedback' ],

    proxy : {
        type : 'rest',

        url : 'steps',

        successProperty : 'success'
    }
} );
阶梯网格

Ext.define( 'Bedrijfsplan.view.step.Grid', {
    extend : 'Ext.grid.Panel',

    alias : 'widget.stepsgrid',

    hideHeaders : true,

    border : false,

    columns : [ {
        header : 'Titel',

        dataIndex : 'title',

        flex : 1
    } ]
 } );

我花了几个小时搜索和尝试,但仍然没有找到解决方案。在此问题上提供一些帮助将不胜感激:)

我看到的唯一奇怪之处是您的:
this.activeRecord.set(stepForm.getForm().getValues())

我总是在商店里使用
.set()
,从来没有记录在案。e、 g:

myDataStore.set( stepForm.getForm().getValues() );
您的模型更新代码: this.activeRecord.set(stepForm.getForm().getValues())

应该可以,但我可能会尝试将其拆分为两行,并设置一个断点来验证getValues()是否返回您期望的结果

还要确保为表单中的每个字段设置了
name
属性,并且该属性与模型中的字段名称完全匹配

最后,在处理属于某个存储的模型时,最好在该存储上调用.sync(),而不是在该模型上调用.save()。商店中的选项
autoSync:true
将在您每次对其中一个型号进行有效更新时自动执行此操作

BasicForm.loadRecord和BasicForm.updateRecord方法为您正在寻找的功能提供了一个很好的包装,可以更好地工作:

onRowSelected: function(activeRecord) {
    stepForm.getForm().loadRecord(activeRecord);
}

onSaveClick: function() {
    var activeRecord = stepForm.getForm().getRecord();
    stepForm.getForm().updateRecord(activeRecord);
    activeRecord.store.sync();
}

商店没有方法
set()
谢谢,这几乎解决了我的问题!但是,有一个问题是,当存储同步时,它会创建一个空记录,而该记录不会保存到后端?请在中的模型验证时读取,当您调用.sync()时,任何未通过验证的模型都不会发送到后端。设置模型的验证器,使模型在填写到足以保存之前不会被发送到服务器。我应该更清楚一点。模型保存到服务器,但保存后,存储区会从无到有地创建一个新的空记录。例如,存储有2条记录,但在将其中一条更新到服务器后,突然有3条记录。真奇怪。到目前为止,我没有使用验证。我解决了最后一个问题。我没有意识到我定义的步骤存储根本没有被使用,而是因为两个模型之间的关系而定义了一个完整的新存储。在storeConfig选项中,我定义了一个带有读卡器的代理,现在一切正常:)