如何为Sencha Touch MVC模型调用beforeSave方法(即每次添加,更新和/或保存模型记录时触发的方法)?
答案 0 :(得分:1)
(假设Sencha Touch 1.x)
据我所知,没有事件告诉您数据会被更改但尚未更改。 但是,更改后事件称为“datachanged”。如果您只需要知道您的数据已被更改(而不是在更改之前),请为此“datachanged”事件添加一个侦听器,并丢弃我写过的其余内容。
但是,如果您确实需要'beforedatachanged'事件,请继续阅读:
您可以通过使用Ext.override覆盖Sencha行为并在实际更改数据之前触发新事件来实现您自己的事件(并将其称为'beforedatachanged')。
听起来可能很难,但事实并非如此:
首先检查一下: 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事件并且你已经完成了设置。