EXTJS模型idProperty字段是否填充了型号名称?

时间:2014-10-07 09:01:30

标签: rest extjs5

我正在尝试针对Restful RubyonRails后端创建一个简单的ExtJS5应用程序。出于某种原因,当我实例化模型时,ExtJs使用模型(和计数器)的名称填充“idProperty”字段。 e.g。

{ “Traffic_id”: “MyApp.model.Person-1”, “EXTERNAL_ID”:0,...

我认为“idProperty”字段本质上是数据记录的主键,通常在将记录插入DB(自动增量)时设置

因此该字段应为null或类似,因为模型尚未添加到商店并同步到后端。

更令人惊讶的是,该字段定义为'int',ExtJS将字符串放入其中!

有人可以告诉我发生了什么事吗?

彼得

下面是一个app.js:小提琴:

Ext.application({
    name : 'Fiddle',

    launch : function() {

        var model = Ext.create('MyApp.model.Person');

       Ext.Msg.alert('Fiddle', JSON.stringify(model.data));

    }
});

Ext.define('MyApp.model.Person', {
    extend: 'Ext.data.Model',
    idProperty: 'Traffic_id',

    proxy: {
        type: 'rest',
        // url: '/traffics.json',
        format: 'json',
        api: {
            create: 'traffics',
            read: 'traffics',
            update: 'traffics/edit',
            destroy: 'traffics'
        },

        reader: {
            type: 'json',
            rootProperty: 'traffic',
            successProperty: 'success',
            messageProperty: 'message'
        },
        writer: {
            type: 'json',
            //writeAllFields  : false,
            //encode: true,
            rootProperty: 'traffic'
        },
        afterRequest: function(req, res) {
            console.log("Ahoy!", req.operation.response);
        },
        listeners: {
            exception: function(proxy, response, operation) {
                //debugger;
                Ext.MessageBox.show({
                    title: 'XXX REMOTE EXCEPTION',
                    msg: operation.getError(),
                    icon: Ext.MessageBox.ERROR,
                    buttons: Ext.Msg.OK
                });
            }
        }
    },

    fields: [{
        name: 'Traffic_id',
        type: 'int'
    }, {
        name: 'external_id',
        type: 'int'
    }, {
        name: 'description',
        type: 'string'
    }, {
        name: 'insertUser',
        type: 'string'
    }, {
        name: 'insertDate',
        type: 'date'
    }]

});

5 个答案:

答案 0 :(得分:2)

设置配置选项:persist: false。创建它时不会将值发送到服务器。当字段用于在客户端上保持状态但不需要持久保存到服务器时,此选项很有用。Ext.data.field.Field.persist

Ext.define('MyApp.model.Person', {
    extend: 'Ext.data.Model',
    idProperty: 'Traffic_id',
    fields: [{
        name: 'Traffic_id',
        type: 'int',
        persist: false
    }, {
        name: 'external_id',
        type: 'int'
    }, {
        name: 'description',
        type: 'string'
    }, {
        name: 'insertUser',
        type: 'string'
    }, {
        name: 'insertDate',
        type: 'date'
    }]
});

答案 1 :(得分:0)

ExtJS为新创建的模型分配“临时”ID;它可以区分已创建客户端尚未保存的模型(“幻像”模型)与已下载的模型。因此,它知道何时调用create vs update,它会(我认为,从内存中)在上传到create REST端点时删除ID。

它需要ID,因为新创建的模型可以进入商店(例如,对于会话,如果没有别的话)。

您看到的ID样式来自默认的sequential生成器。

有关详情,请参阅http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.data.identifier.Generator

答案 2 :(得分:0)

使用calculate函数添加另一个字段,并将false保持为模型。在View中使用此字段而不是idProperty:

Ext.define('MyApp.model.MyModel', {
    extend: 'Ext.data.Model',

    requires: [
        'Ext.data.field.Integer',
        'Ext.data.field.String'
    ],

    idProperty: 'myId',

    fields: [
        {
            type: 'int',
            mapping: 'myId',
            name: 'myId'
        },
        {
            type: 'string',
            mapping: 'myName',
            name: 'myName'
        },
        {
            calculate: function(data) {
                if(!data) {
                    return '';
                }
                else {
                    return data.myId;
                }
            },
            name: 'myViewId',
            persist: false
        }
    ]
});

答案 3 :(得分:0)

我做了一个解决方法。创建模型实例后,将id属性设置为null。

var instance = Ext.create('MyModel');
instance.set('idProperty', null);

答案 4 :(得分:0)

您有可能需要坚持该选择。如果要自定义ID,还有另一种选择。使用标识符。我的操作方式:在模型中添加以下代码。

identifier: {
        type: 'sequential',
        seed: 3
},