Sencha Touch MVC Model beforeSave

时间:2011-11-28 02:04:09

标签: javascript sencha-touch

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

1 个答案:

答案 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事件并且你已经完成了设置。