0

jsonp 応答からいくつかのモデル インスタンスを生成するために、Sencha Touch 2 ストアを設定していくつかのデータを取得するのは簡単かもしれません。ただし、私はサーバー上で利用可能なかなり大きなデータ セット (法的意見) を操作するアプリを開発しているため、サーバーから利用可能なレコードの単なるリスト (必要に応じてインデックス) を取得する必要があります。ユーザーがリスト内のアイテムをタップすると、単一の完全なレコードが取得されます。

これを行うための推奨される方法を探しています。これは私がこれまでに設定したもので、部分的にしか機能していません:

  1. :index および :show RESTful アクションをサーバー側で定義して、法的意見を取得しています。
  2. クライアント側には、インデックス エントリ (利用可能なデータのリストを構成する) のモデルとストアがあり、サーバー上の :index RESTful アクションからの jsonp 応答を介してデータをプルし、利用可能なデータのインデックスを作成します。リストコンポーネントで。これらのインデックス エントリのフィールドには、法的意見の全文は含まれていませんが、当事者の名前と引用のみが含まれています。
  3. 完全な法的意見のモデルとストアがあります。ストアは、サーバー上の :show RESTful アクションを介して、一度に 1 つの法的意見をサーバーから取得します。
  4. ユーザーがアプリ内の法的意見のリスト内の項目の 1 つをタップすると、リスナーがイベントを発生させ、コントローラーがそれを取得します。コントローラーは、次のように、リスト項目の対応するレコードの ID を使用して、サーバー上の :show アクションの適切な URL を決定します。

        # Controller:
        onDisplayAuthority: function(list, record) {
          console.log('onDisplayAuthority');        
          this.activateAuthorityView(record);
    
          var authorityView = this.getAuthorityView();
          authorityStore = Ext.getStore('Authority');
    
          var authorityId = record.getData().id;
          var url = 'http://localhost:3000/api/authorities/' + authorityId + '.json';
          var proxy = {
            type: 'jsonp',
            url: url,
            reader: {
                type: 'json',
                rootProperty: "authority"
            }
          };
    
          authorityStore.setProxy(proxy);
          authorityStore.load();
    
          authority = authorityStore.first();
          var data = authority.getData();
    
          authorityView.setRecord(authority);
    
          authorityView.getComponent("authorityViewBody").setData(data);
          authorityView.getComponent("titlebar").setTitle(data.title);
    
          Ext.Viewport.animateActiveItem(authorityView, this.slideLeftTransition);
    
      }
    

このコードは機能しません。何らかの理由で、上記のコード内で実行すると、完全な法的意見が含まれているconsole.log(authorityStore)ことがわかります。authorityStore.data.all[0]しかし、実行するconsole.log(authorityStore.data.all[0])と が返されます[]。さらに、 をauthorityStore.first();返しますundefinedが、Sencha Touch 2 のドキュメントでは、これ#first()は有効なストアのメソッドであり、有効なストアであることが示されていauthorityStoreます。

だから、私は何か基本的なものを見逃しているか、これについては人里離れた道を進んでいます.

(i) 私の問題に対する迅速な解決策、または (ii) :index: と :show アクションの両方を使用して余分なデータ転送を削減する別の方法を誰かが持っていますか?

4

1 に答える 1

0

これはうまくいきました:

onDisplayAuthority: function(list, record) {
    console.log('onDisplayAuthority');
    var authorityView = this.getAuthorityView();
    authorityStore = Ext.getStore('Authority');

    var authorityId = record.getData().id;
    var url = 'http://localhost:3000/api/authorities/' + authorityId + '.json';
    var proxy = {
        type: 'jsonp',
        url: url,
        reader: {
            type: 'json',
            rootProperty: "authority"
        }
    };

    authorityStore.setProxy(proxy);
    authorityStore.load({
        callback: function(records, operation, success) {
            // the operation object contains all of the details of the load operation
            var data = records[0].getData();
            authorityView.setRecord(records[0]);

            authorityView.getComponent("authorityViewBody").setData(data);
            authorityView.getComponent("titlebar").setTitle(data.title);
        },
        scope: this});      

    Ext.Viewport.animateActiveItem(authorityView, this.slideLeftTransition);
}

ストアの#loadメソッドからのコールバック内にデータを設定するコード行を配置することでauthorityView、新しいレコードにアクセスすることができました。なぜこのようにしなければならなかったのかわかりませんので、コメントをいただければ幸いです。しかし、このアプローチ機能します。

于 2013-01-02T01:10:11.760 に答える