0

设置 Sencha Touch 2 存储以检索少量数据以从 jsonp 响应生成多个模型实例可能很简单。但是,我正在开发一个应用程序,该应用程序可以处理服务器上可用的相当大的数据集(法律意见),所以我必须从服务器中检索可用记录的列表——如果你愿意的话,是一个索引——然后当用户点击列表中的项目时检索单个完整记录。

我正在寻找任何推荐的方法。这是我到目前为止设置的,只是部分工作:

  1. 我在服务器端定义了 :index 和 :show RESTful 操作来检索法律意见。
  2. 在客户端,我有一个模型和一个用于索引条目的存储(包括我的可用数据列表),它们通过来自服务器上 :index RESTful 操作的 jsonp 响应提取数据,以创建可用数据的索引在 List 组件中。这些索引条目中的字段不包含法律意见的全文,而仅包含当事人的姓名和引文。
  3. 我有一个模型并存储完整的法律意见。商店通过服务器上的 :show RESTful 操作一次从服务器提取一个法律意见。
  4. 当用户点击应用程序中法律意见列表中的一项时,监听器会触发一个事件,控制器会接收该事件。控制器使用列表项对应记录的 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);
}

通过将设置数据的代码行放在authorityView商店的#load 方法的回调中,我能够访问新记录。我不知道为什么我必须这样做,并希望得到评论。但是,这种方法确实有效。

于 2013-01-02T01:10:11.760 回答