如何从服务器检索记录索引到我的Sencha Touch 2应用程序,然后检索完整的模型实例

时间:2013-01-02 00:33:52

标签: extjs sencha-touch sencha-touch-2

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

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

  1. 我有:index和:显示在服务器端定义的RESTful操作以检索法律意见。
  2. 在客户端,我有一个模型和一个索引条目存储(包含我的可用数据列表),它们通过服务器上的:index RESTful操作的jsonp响应来提取数据,以创建索引List组件中的可用数据。这些索引条目中的字段不包含法律意见的全文,只包含当事人的姓名和引文。
  3. 我有一个模型和商店,可以获得完整的法律意见。该商店通过以下方式从服务器中提取单一法律意见:在服务器上显示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);
    
      }
    
  5. 此代码不起作用。出于某种原因,如果我在上面的代码中运行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 action减少无关的数据传输?

1 个答案:

答案 0 :(得分: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数据的代码行,我能够访问新记录。我不知道为什么我必须这样做,并希望评论。但是,这种方法 工作。