2012-08-01 68 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; 
} 

使用真正作爲最後一個參數,將解決你的問題的雛形。

相關問題