我如何调用beforeSave方法(即每次添加,更新和/或保存模型记录时触发的方法)为Sencha Touch MVC模型?
(假设Sencha Touch 1.x)
据我所知,没有事件告诉你数据将被更改,但还没有更改。然而,更改后的事件被称为"数据更改"。如果你只需要知道你的数据被改变了(而不是在它被改变之前),为这个' datachchanged '事件添加一个监听器,并放弃我写的其余内容。
然而,如果你真的需要一个' beforedatchanged '事件,请继续阅读:
你可以实现你自己的事件(并称之为' beforedatachchanged '),通过使用Ext.override来覆盖Sencha行为,并在数据实际改变之前触发你的新事件
这可能听起来很难,但它真的不是:
先看看这个:http://docs.sencha.com/touch/1-1/source/AbstractStore.html找到"onBatchComplete",你会看到它触发了' datachchanged '事件:
/**
* @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);
},
});
然后你需要在你的模型代码中监听beforedatachchanged事件,你就都设置好了。