2012-08-01 48 views
1

在下面,我想在我的数据存储检索特定类别的纪录基于什么值存储于该字段的(列的)价值在我的网格中的类别字段。 “categoryId”的值返回“2”。为什么不是findRecord返回记录?它显示“-1”为“类别”。当我将它作为组合框存储在我的表单中时,存在key = 2的记录。我最终希望找到key = 2的记录,然后返回value属性,以便在我的网格视图中显示该记录的value属性。Ext JS 4:为什么不是我的Ext.data.Store“findRecord”函数返回一个值?

FYI:“密钥”属性的类别记录和“值”属性的ID是我想说明的类别记录的名称(或在网格单元渲染)。

类别店:

Ext.define('DropdownOption', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     { name: 'key' }, 
     { name: 'value' } 
    ] 
}); 

var statusDropdownStore = new Ext.data.Store({ 
    proxy: new Ext.ux.AspWebAjaxProxy({ 
     url: '/track/Controls/Shared/GeneralService.asmx/GetDropdownOptions', 
     actionMethods: {     
      read: 'POST' 
     }, 
     extraParams: { 
      user_login: authUser, 
      table_name: '[status]' 
     }, 
     reader: { 
      type: 'json', 
      model: 'DropdownOption', 
      root: 'd' 
     }, 
     headers: { 
      'Content-Type': 'application/json; charset=utf-8' 
     } 
    }) 
}); 

视图(Ext.grid.Panel)列:

  columns: [ 

       ... snip ... 

       { text: 'Status', dataIndex: 'status', sortable: true, 
        renderer: function(value, metaData, record, row, col, store, gridView) { 

         var categoryId = record.get('status'); 
         alert("categoryId: " + categoryId); // displays "categoryId: 2" 
         if (categoryId > 0) 
         { 
          var category = statusDropdownStore.findRecord('key', categoryId); 
          alert("category: " + category); // displays "category: -1" which usually means not found 
          //alert(category.get('value')); 
          return ''; // return value property of category record 
         } 
         else 
         { 
          return ''; 
         } 
        } 
       }, 

       { text: 'Date Modified', dataIndex: 'date_modified', sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y') }, 

       ... snip ... 

      ], 

=============== =====

2012年8月1日@ 5:21 pm更新:

好吧,网格初始加载时的值为空(意味着它命中“返回”;“代码行”。但是当我进入记录并单击“保存”时,网格中的所有行都会显示类别名称 - 使用下面的新代码。作为一个方面说明,我曾经有名为“key”的id列,但我将其重命名为“id”。

   { text: 'Status', dataIndex: 'status', sortable: true, 
        renderer: function(value) { //, metaData, record, row, col, store, gridView) { 

         if (value > 0) { 
          var r = statusDropdownStore.findRecord('id', value); 
          if (r != null) 
          { 
           var catName = r.get('value'); 
           return catName; 
          } 
         } 
         return ''; 
        } 
       }, 
+0

嗨。你可以使用Store与本地数据在jsFiddle中发布相同的内容吗?这样做,我们可以看到发生了什么问题。 – davidbuzatto 2012-08-01 21:11:32

+0

作为渲染器的第一行给出了什么'console.log(value)'? – Geronimo 2012-08-01 22:31:18

回答

2

你的代码看起来完全正常,我做同样的事情也渲染:

renderer: function(value) { 
    if (value) { 
     var record = refStore.findRecord('id', value), 
      name = record.get('name'); 
     return name; 
    } 
}, 

奇怪的是,findRecord应该返回null如果没有找到,不为-1。

我能想到的唯一的事情是这样的from the docs

当店进行过滤,发现仅在筛选记录。

这里是我使用该refStore(以上)的模型:

Ext.define('MyApp.model.Reference', { 
    extend: 'Ext.data.Model', 
    fields: [ 
     {name: 'id', type: 'int'}, 
     {name: 'name', type: 'string'}, 
     {name: 'active',type: 'bool'} 
    ], 
}); 
+0

你可以粘贴一个你的模型吗?我尝试添加idProperty:'key'到我的模型中,以使每条记录都是唯一的,但那不起作用。 – MacGyver 2012-08-01 21:30:17

+0

@MacGyver新增模型 – Geronimo 2012-08-01 21:47:41

+0

看到我的最新更新 – MacGyver 2012-08-01 22:25:37

0

见findByREcord

findRecord: function(fieldName, value, startIndex, anyMatch, caseSensitive, exactMatch) {   
var index = -1; 

    if(fieldName && (value || value === 0)) { 
    var options = Ext.applyIf({ 
     property: fieldName, 
     value: value, 
     anyMatch: anyMatch, 
     caseSensitive: caseSensitive, 
     exactMatch: exactMatch, 
     root: 'data' 
    }, { 
     anyMatch: false, 
     caseSensitive: false, 
     exactMatch: true 
    }); 
    var filter = Ext.create('Ext.util.Filter', options); 
    index = this.data.findIndexBy(filter.getFilterFn(), null, startIndex); 
    } 

    return index > -1 ? this.getAt(index) : null; 
} 

使用真正作为最后一个参数,将解决你的问题的雏形。

相关问题