1

ST1.x では、以下の方法でオンラインストアをオフラインストアに同期するのに問題はありませんでしたが、STB2 では同期が機能しないようです。コンソールにレコードが出力されているのがわかります。この問題を抱えている他の人はいますか?私はそれがバグである可能性があると信じています...

var remoteStore = Ext.getStore('UpdateConfig');
var localStore = Ext.getStore('UpdateLocalConfig');

remoteStore.each(function (record) {
    localStore.add(record.data);
    console.log(record.data);
});
localStore.sync();
4

2 に答える 2

2

これはTommyMaintz によってSencha Touch 2 Forumsで回答されましたが、ここでも回答したいと思います。

「間違っていると思うことの 1 つは、record.data を使用して LocalStore にレコードを追加していることです。ST2 では、モデル キャッシュができました。これは、まったく同じモデルと ID を持つ 2 つのインスタンスを作成した場合、 , そのインスタンスを 2 回目に作成すると、既存のインスタンスが返されるだけです. これは、ローカル ストアを同期する場合、そのレコードには既に ID があるため、そのレコードを「ファントム」レコードとして認識しないことを意味します.すべてのデータを使用して ID を削除してレコードの「コピー」を作成する場合は、この操作を行う必要があります。これにより、新しいシンプルな ID が生成され、それをローカル ストレージに保存すると、適切なローカル ID。

これを実行しようとしたとき、モデルの「コピー」メソッドがこれを処理するように更新されていないことに気付きました。次のオーバーライドを適用すると、 localStore.add(record.copy()); を実行できるはずです。localStore.sync()"

Ext.define('Ext.data.ModelCopyFix', {
    override: 'Ext.data.Model',

    /**
     * Creates a copy (clone) of this Model instance.
     *
     * @param {String} id A new id. If you don't specify this a new id will be generated for you.
     * To generate a phantom instance with a new id use:
     *
     *     var rec = record.copy(); // clone the record with a new id
     *
     * @return {Ext.data.Model}
     */
    copy: function(newId) {
        var me = this,
            idProperty = me.getIdProperty(),
            raw = Ext.apply({}, me.raw),
            data = Ext.apply({}, me.data);

        delete raw[idProperty];
        delete data[idProperty];

        return new me.self(null, newId, raw, data);
    }
});
于 2012-02-10T14:39:55.657 に答える