Sencha Touch MVC Model beforeSave

问题描述:

如何为Sencha Touch MVC模型调用beforeSave方法(即每次添加,更新和/或保存模型记录时触发的方法)?Sencha Touch MVC Model beforeSave

(假设煎茶触摸的1.x)

据我所知是没有的事件,告诉您的数据将被改变,但还没有发生变化。 但是,变更后事件被称为“datachanged”。如果您只需要知道您的数据已更改(而不是在更改之前),请为此“datachanged”事件添加一个侦听器,并丢弃我已写入的其他数据。

但是,如果你真的需要一个“beforedatachanged”事件,请继续阅读:

您可以实现自己的事件(并将其命名为“beforedatachanged”)通过使用Ext.override覆盖煎茶行为,并触发数据实际更改前的新事件。

这听起来很难,但它确实不是:

首先检查了这一点: http://docs.sencha.com/touch/1-1/source/AbstractStore.html 去找“onBatchComplete”,你会看到,它激发了“datachanged”事件:

/** 
* @private 
* Attached as the 'complete' event listener to a proxy's Batch object. Iterates over the batch operations 
* and updates the Store's internal data MixedCollection. 
*/ 
onBatchComplete: function(batch, operation) { 
    var operations = batch.operations, 
     length = operations.length, 
     i; 

    this.suspendEvents(); 

    for (i = 0; i < length; i++) { 
     this.onProxyWrite(operations[i]); 
    } 

    this.resumeEvents(); 

    this.fireEvent('datachanged', this); 
}, 

在“this.suspendEvents();”之前你必须解雇你自己的自定义事件,因为在那之后,这些操作就被执行了。

要覆盖此,写这样的事情在你的应用程序:

Ext.override(Ext.data.AbstractStore, 
{ 
    onBatchComplete: function(batch, operation) 
    { 
     var operations = batch.operations, 
      length = operations.length, 
      i; 

     this.fireEvent('beforedatachanged', this); 

     this.suspendEvents(); 

     for (i = 0; i < length; i++) { 
      this.onProxyWrite(operations[i]); 
     } 

     this.resumeEvents(); 

     this.fireEvent('datachanged', this); 
    }, 
}); 

然后,你需要听你的模型代码的beforedatachanged事件和你所有的设置。