【问题标题】:Is it possible to mark a store field as readonly in ExtJS?是否可以在 ExtJS 中将存储字段标记为只读?
【发布时间】:2011-01-07 03:56:38
【问题描述】:

在 ExtJS 中,我有一个 JsonStore 配置如下:

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 属性,因为它应该是只读的。有没有办法配置商店或记录以获得这种行为?

【问题讨论】:

    标签: javascript json extjs properties readonly


    【解决方案1】:

    由于Ext4你可以使用

    persist: false 
    

    在模型字段描述中

    【讨论】:

      【解决方案2】:
      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 }
          ]
      });
      

      时间戳字段永远不会发送到服务器。

      【讨论】:

        【解决方案3】:

        如果您在时间戳字段上设置了 {disabled: true},则不应将其提交给服务器

        【讨论】:

        • 您指的是Ext.form.Field,而我指的是Ext.data.Field。我提供的示例代码清楚地表明我没有使用表单。
        【解决方案4】:

        您还可以在时间戳字段上将默认值设置为您想要的任何值。您已将 JsonWriter 配置为继续写入所有字段。如果您将默认值设置为 '' 或 NULL,您可能能够获得所需的行为。

        【讨论】:

        • 将其设置为 null 仍然会发送属性,只是使用 null 值。我认为我必须覆盖 JsonStoreRecord 的默认行为以包含 readonly 配置属性。
        【解决方案5】:

        您可以尝试拦截对编写器的调用,然后删除当时的时间戳:

        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,
        ...
        

        【讨论】:

          【解决方案6】:

          writeAllFields 必须是true 吗?默认为false,如果你不更新它就不会发送时间戳属性。

          或者,您可以覆盖JsonWriter 上的toHash 函数。目前它有这样的评论:

          TODO Implement excludes/only configuration with 2nd param
          

          您可以添加自己的实现。

          【讨论】:

          • 是的,它必须是真的,因为我正在使用的 REST 服务会进行替换。如果我不发送一个属性,它会假定该属性为空,并将其保存到数据库中,覆盖和以前的值。
          • 这应该是“任何以前的值”,而不是“和以前的值”。
          • 啊。然后覆盖toHash,我想。
          猜你喜欢
          • 2010-10-29
          • 2013-05-24
          • 2016-01-19
          • 1970-01-01
          • 2010-09-21
          • 1970-01-01
          • 2012-04-14
          • 1970-01-01
          • 2018-05-29
          相关资源
          最近更新 更多