0

私がやろうとしていること:

ユーザーがすべてのデータをアップロードすることを決定するまで、データをローカルに保存できるようにします。これを実現するために、フォームからモデルにデータを入力してから、このモデルをストア (同期) に入力しています。このストアには、ローカル ストレージ プロキシがあります。
offlineStore.js :

Ext.define('blahblah.store.offlineStore',{
extend:'Ext.data.Store',
config:{
    model:'blahblah.model.myModel',
    id: 'offlineRegisterStore',
    sorters:'xyz',
    grouper:function(record){
        return record.get('xyz')[0];
    },
    proxy: {
        type: 'localstorage',
        id: 'offlineRegisterStoreid'
    }
 ...

ここで、ユーザーが同期ボタンを押すと、このオフライン ストアから、REST 呼び出しを実行するプロキシを持つ別のストア (
OnlineStore ) にデータをコピーします。

   Ext.define('blahblah.store.upStore', {
     extend: 'Ext.data.Store',
     config: {
        model: 'blahblah.model.myModel',
        id: 'abc',
        sorters: 'xyz',
        grouper: function (record) {
          return record.get('xyz')[0];
        },
        proxy: {
        type: 'rest',
        url: HOST,
        headers: HEADERS,
        reader: {
            type: 'json'

        },
        writer: {
            type: 'json'
        }
    ...

問題:

残念ながら、オフライン ストアからオンライン ストアにデータを追加しても、オンライン ストアは実行されません。その結果、REST 呼び出しは行われません。これは、ストアに変更されていないデータが同期されている場合に発生することを認識しています。オフライン ストアからオンライン ストアにデータをコピーする前にオンライン ストアに何も追加していなかったので、これは奇妙でした。 store.sync()

ということconsole.logで、作成後すぐにオンラインストアにアップしました。このストアには既にフォーム データが入力されていることがわかりました。そして、今回はオフラインストアsync()から同じデータを追加しているので、これが実行されない理由だと思います。このオンライン ストアがどのようにしてどこからデータを入手したのか、私は困惑しています。オフライン ストアからオンライン ストアに何かを追加する前に も試しましたが、ストアのコンテンツには影響しませんでした。
store.removeAll()

もっとコードを見る必要があるかどうか教えてください。

編集 1 : オフライン ストアを埋める方法 - モデルのインスタンスを作成し、フォーム データを入力して実行しofflineStore.add(myModel)ます。この後、私はそうしますofflineStore.sync()。これは、モデルにデータを入力する方法です。

var myModel = Ext.create('blahblah.model.myDataModel',{  
    datafield1 = formdata1,
    datafield2 = formdata2
});  

どの時点でオンライン ストアを確認するか:
ユーザーがフォームの [送信] ボタンをクリックすると、オフライン ストアを取得してオンライン ストアを作成します。驚いたことに、オンライン ストアだけでなく、オフライン ストアでさえ、フォーム データを編集した時点で正しいことがgetStoreわかりました。sync()つまり、基本的に、データは、実行する前、またはデータで満たされたモデルを追加する前であっても、オフライン ストアとオンライン ストアに入力されますか? これは私をさらに混乱させます。

4

2 に答える 2

2

ついにSenchaフォーラムから私の問題の解決策を見つけました:設定record.phantom = true

(オフラインストアから)オンラインストアにレコードを追加する前に、上記のコードを実行しました。これで、ストアが同期されたときに、新しく追加されたレコードが実際に新しいレコードであると見なされ、POSTリクエストが実行されました。

record.dirty = trueまた、代わりにを設定すると、ストアがPOSTではなくPUTリクエストを送信したことも追加する必要があります。

于 2012-07-09T15:28:23.453 に答える
0

「フォームからモデルにデータを入力している」と言っている場合、両方のストアがそのモデルにバインドされているため、両方のストアがそのデータに到達すると思います。オンラインストアをチェックしてフォームデータを確認するのは、具体的にどの時点ですか? フォーム内のすべてのキーストロークで更新されますか?

これを解決する方法についてのいくつかの考え:

  • Ext.data.Storeオフライン データの場合はいいえ- ユーザーが送信するまで、完全に分離された構造にデータを格納することをお勧めします。これは、オフライン ストアではなく、ある種のカスタム フォーム バッキング オブジェクトです。これはおそらくモデルの一部を複製することを意味しますが、それを防ぐ方法は確かにあります (別の場所でフィールドを定義し、それらを使用して ExtJS モデルとカスタム オブジェクトを拡張するなど)。

  • 関数をオーバーライドsyncしてデータをフィルター処理する- モデル プロパティsubmittedを追加し、ストアの同期メソッドをオーバーライドして、submitted===true. したがって、ローカルではストアにすべてのデータがありますが、承認されたデータ項目のみがサーバーに転送されます。

  • 同じストア オブジェクト- どういうわけか、同じストア オブジェクトを別の名前で持っていますか? 異なる ID で異なるストアを定義していますが、実際に異なることを確認しましたか? いつでも同じデータを保持しているように聞こえますか?!

これが役立つかどうか教えてください。

于 2012-07-06T10:28:01.340 に答える