2011-01-07 8 views
2

は、私はこのように構成されたJsonStoreを持っている:ExtJSでストアフィールドを読み取り専用としてマークすることはできますか? ExtJSので

var store = new Ext.data.JsonStore({ 
    // basic properties 
    restful: true, 
    autoSave: true, 

    // json writer 
    writer: new Ext.data.JsonWriter({ 
     encode: false, 
     writeAllFields: true 
    }), 

    // field config 
    fields: [ 
     'id', 
     'name', 
     { name: 'timestamp', type: 'date', dateFormat: 'c' } 
    ] 
}); 

timestampプロパティは、サーバーで設定する必要があり、クライアントはそれをお読みください。しかし、私が使用してレコードを追加または更新しようとした場合JsonStore

// add a record 
var record = new store.recordType({ name: 'New record' }); 
store.insert(0, record); 

// update a record 
var record = store.getAt(0); 
record.set('name', 'Modified record'); 

サーバにオーバー送信されていますJSONは次のようになります。私は送信を停止することを希望

{ 
    "id": 5, 
    "name": "Modified record", 
    "timestamp": "01-06-2001T15:23:14" 
} 

timestampプロパティでは、読み取り専用になっているためです。この動作を行うには、ストアまたはレコードを構成する方法はありますか?あなたは{無効:真}設定されている場合

答えて

0

タイムスタンプフィールド上を、それがサーバー

+0

persist: false 

を使用することができます。フィールド。私が提供したサンプルコードは、私がフォームを使用していないことを明確に示しています。 –

0

に提出すべきではありませんまた、あなたがタイムスタンプフィールドに好きにデフォルト値を設定することができます。 JsonWriterを設定して、すべてのフィールドに書き込むようにしました。デフォルト値を ''またはNULLに設定すると、必要な動作を得ることができます。

+0

これをnullに設定すると、代わりにnull値だけでプロパティが送信されます。私は、 'readonly'設定プロパティを含めるために' JsonStore'か 'Record'のどちらかのデフォルト動作を変更する必要があると思います。 –

0

あなたはライターに通話を傍受しようとすると、ちょうどその時にタイムスタンプを削除できます。

var writer = new Ext.data.JsonWriter({ 
    encode: false, 
    writeAllFields: true 
}); 

Ext.intercept(writer, 'render', function(params, baseParams, data) { 
    delete data.timestamp; 
}); 

var store = new Ext.data.JsonStore({ 
... 
writer: writer, 
... 
0

writeAllFieldstrueことがありますか?デフォルト値はfalseで、更新しなかった場合はtimestampプロパティを送信しません。

また、JsonWritertoHash機能を無効にすることもできます。現時点では、このコメントがあります。

TODO Implement excludes/only configuration with 2nd param 

独自の実装を追加できます。その後、

+0

はい、私は使用しているRESTサービスが置き換えを行うため、trueにする必要があります。私がプロパティを送信しない場合、プロパティはnullであるとみなされ、それをデータベースに上書きし、以前の値として保存します。 –

+0

これは「以前の値」ではなく、「以前の値」であったはずです。 –

+0

ああ。それから、 'toHash'をオーバーライドしてください。 – wombleton

1
Ext.namespace('Ext.ux'); 

/** 
* Extension of the JsonWriter that doesn't send fields having the config option 
* write set to false 
* @author Friedrich Röhrs 
* @verison 1.0 
* 
*/ 
Ext.ux.AdvJsonWriter = function (config) { 
    Ext.ux.AdvJsonWriter.superclass.constructor.call(this, config); 
}; 
Ext.extend(Ext.ux.AdvJsonWriter, Ext.data.JsonWriter, /** @lends Ext.ux.AdvJsonWriter */{ 
    toHash: function(rec, options) { 
     var map = rec.fields.map, 
      data = {}, 
      raw = (this.writeAllFields === false && rec.phantom === false) ? rec.getChanges() : rec.data, 
      m; 
     Ext.iterate(raw, function(prop, value){ 
      if((m = map[prop])){ 
       if (m.write !== false) 
        data[m.mapping ? m.mapping : m.name] = value; 
      } 
     }); 
     // we don't want to write Ext auto-generated id to hash. Careful not to remove it on Models not having auto-increment pk though. 
     // We can tell its not auto-increment if the user defined a DataReader field for it *and* that field's value is non-empty. 
     // we could also do a RegExp here for the Ext.data.Record AUTO_ID prefix. 
     if (rec.phantom) { 
      if (rec.fields.containsKey(this.meta.idProperty) && Ext.isEmpty(rec.data[this.meta.idProperty])) { 
       delete data[this.meta.idProperty]; 
      } 
     } else { 
      data[this.meta.idProperty] = rec.id; 
     } 
     return data; 
    } 
}); 

var store = new Ext.data.JsonStore({ 
    // basic properties 
    restful: true, 
    autoSave: true, 

    // json writer 
    writer: new Ext.ux.AdvJsonWriter({ 
     encode: false, 
     writeAllFields: true 
    }), 

    // field config 
    fields: [ 
     'id', 
     'name', 
     { name: 'timestamp', type: 'date', dateFormat: 'c', write: false } 
    ] 
}); 

タイムスタンプフィールドは、サーバーに送信されることはありません。私は `Ext.dataを参照てるのに対し

2

Ext4のので、あなたは、あなたが` Ext.form.Field`を参照しているモデルのフィールドの説明

関連する問題