2013-05-18 19 views
2

我在用于添加和编辑我的一个模型的表单上有一个组合框。组合框绑定的值列表可能会非常大(1,000条记录),所以我需要使用带分页的远程数据存储来防止必须一次加载所有值。在添加表单中,这很好,但是当我尝试使用表单编辑我的模型时,我无法将值可靠地设置为组合框。Ext JS 4.2 Combobox与远程存储和分页默认值问题

当组合框加载时,商店加载前50个记录。问题是,在设置值之前,组合框setValue函数仅在商店中为该记录搜索加载的值。如果所选记录不在商店的前50个记录中,则setValue不会找到它并且该值未设置。

我已经创建了一个的jsfiddle演示该问题:http://jsfiddle.net/mgolus/Z3Jpy/

的代码如下:

var testVendorId; 
testVendorId = 30; // Works 
//testVendorId = 60; // Doesn't Work :-(

Ext.onReady(function() { 
    var addUserForm = Ext.create('Ext.form.Panel', { 
    renderTo: Ext.getBody(), 
    model: 'Test.model.CatalogItem', 
    items: [ 
      { 
       xtype: 'textfield', 
       name: 'number', 
       fieldLabel: 'Number' 
      }, 
      { 
       xtype: 'combobox', 
       name: 'vendorId', 
       fieldLabel: 'Vendor', 
       forceSelection: true, 
       store: { 
        model: 'Test.model.Vendor', 
        autoLoad: true, 
        pageSize: 50 
       }, 
       displayField: 'name', 
       valueField: 'id', 
       pageSize: 50 // I know this just needs to be any value > 0 to show the pager, just putting 50 for consistency 
      } 
     ], 
    }); 

    addUserForm.down('combobox').getStore().on('load', function() { 
      var user = Ext.create('Test.model.CatalogItem', { id: 1, number: 'T001', vendorId: testVendorId }); 
      console.log(user); 
      addUserForm.loadRecord(user);  
    }); 


}); 

Ext.define('Test.model.CatalogItem', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'id' }, 
     { name: 'number' }, 
     { name: 'vendorId' } 
    ] 
}); 

Ext.define('Test.model.Vendor', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'id' }, 
     { name: 'name' } 
    ], 
    proxy: { 
     type: 'jsonp', 
     url: 'http://pmvitals.com/vendors.aspx', 
     reader: { 
      root: 'data' 
     } 
    } 
}); 

当所选择的ID(testVendorId设置在顶部)为30,组合框与填充默认值。如果您将该ID设置为50以上的任何值,则该值将不会填充,因为该值不存在于商店的第一页中。

任何帮助,非常感谢!

回答

2

我遇到了类似的问题。为了克服它,我创建了一个组合框的自定义扩展(我称之为RemoteComboBox)。它的一个主要特点是,如果它的值是通过表单记录加载设置的,甚至只是setValue(),则默认的加载行为是对实际值进行远程请求。这会返回1值,所以响应很小,然后一旦用户开始再次与其交互,组合框的默认行为就会接管。

与我的解决方案和您的需求的区别是,您仍然会遇到分页问题。即使你的价值最初是由基于id的请求发现的,你仍然会面临在多页记录中查找同一项目的挑战。

你真的需要分页吗?我发现简单地提供更丰富的搜索工具通常比强制用户筛选几页记录更有帮助。