2012-06-08 1 views
1

Я пытаюсь заполнить форму данными ответа сервера, полученными всякий раз, когда я нажимаю на имя в сетке. По большей части мне это удалось. Однако по какой-то причине, в первый раз, когда я нажимаю на имя в сетке, я получаю «undefine» для store.proxy.reader.rawData. Неважно, какое имя я нажимаю первым, он всегда это делает. Любые последующие клики возвращают ожидаемую строку json. Я использую firebug, чтобы помочь мне решить проблему.rawData undefined для первого действия POST ExtJS

Ниже приведен код для магазина «», где количество людей я сделать запрос Ajax:

Ext.define('CX.store.PersonS', 
{ 
    extend: 'Ext.data.Store', 
    model: 'CX.model.PersonM', 
    autoLoad: false, 
    proxy: 
    { 
     type: 'ajax', 
     actionMethods: { 
      update:'POST' 
     }, 
     url: '.../CensusXPHP/app/store/getUserIdInfo.php', 
     reader: 
     { 
      type: 'json' 
     }  
    } 
}); 

Ниже приводится функция в контроллере, где загружен выше магазин.

showMess: function(grid,record) 
    { 
     var tempId = record.get('transId');       //grab translation ID 
     var name = record.get('fname') + ' ' + record.get('lname'); //grab name of current user 
     var store = this.getPersonSStore(); 
     store.load(
     { 
      params:{cid:tempId} 
     })    

     var info = store.data; 
     console.log(info) 
     console.log(store.proxy.reader.rawData) 
    } 
}; 

Я печатать две вещи консоли: объект store.data и store.proxy.reader.rawData. Распечатка непосредственно ниже показывает операторы POST и консоль печати для первых двух событий щелчка:

> POST http:app/store/getUserIdInfo.php?_dc=1339179358498 
> Object { items=[0], map={...}, keys=[0], more...} 
> 
> POST http:/app/store/getUserIdInfo.php?_dc=1339179359680 
> Object { items=[1], map={...}, keys=[1], more...} Object { id="123", bday="1/5/89", payPref="credit", more...} 

Я нажал на то же имя и оба раза. Как вы можете видеть, объект store.data говорит, что у него есть нулевые элементы во время первого щелчка, а rawData «undefine; HOWEVER, когда я расширяю информацию для объекта store.data для первого щелчка, вы можете видеть, что действительно есть . пункт со строкой JSON (это же информация в качестве второго пункта щелчка, потому что я нажал на то же имя дважды) отпечаток ниже показывает это:.

> $className "Ext.util.MixedCollection" 
>.  
>.  
>.   
> -items: [Object {internalId="123", raw={...}, data={...}, more...}]   
> --0: Object {internalId="123", raw={...}, data={...}, more...} 
> ---$className: "CX.model.PersonM"  
> ---$inheritableStatics: ["setProxy","getProxy", "load"] 
> ---alternateClassName: "Ext.data.Record"  
> ---associations: Object { items=[0], map={...}, keys=[0], more...} 
> ---onfig: Object {}   
> ---data: Object { bday="1/5/89", street="123 Main St", city="Los Angeles", more...}   
> ---defaultProxyType: "ajax"  
> ---dirty:   false  
> ---editing:   false 
>. 
>. 
>. 

Я понятия не имею, что происходит, я был работая с ExtJS в течение двух недель, поэтому мне трудно увидеть какие-либо тонкие ошибки (или даже ослепительные). Будет ли кто-то указывать на меня в правильном направлении?

Спасибо за вашу помощь! -K

ответ

0

store.load метод асинхронный, поэтому после вызова он начинает загружать данные и возвращает управление. Когда вы вызываете showMess первый раз, rawData не определен, так как данные еще не загружены на данный момент. Каждый другой вызов отображает результат предыдущего запроса. Используйте load событие, например:

showMess: function(grid,record) 
{ 
    var tempId = record.get('transId');       //grab translation ID 
    var name = record.get('fname') + ' ' + record.get('lname'); //grab name of current user 
    var store = this.getPersonSStore(); 
    store.load(
    { 
     params:{cid:tempId} 
    });    

    store.on('load', function() { 
     var info = store.data; 
     console.log(info); 
     console.log(store.proxy.reader.rawData); 
    }, this, { single: true }); 
} 
+1

Eeeeeeek! Это сработало! БОЛЬШОЕ СПАСИБО! – karol

0

Как указано Лоло, store.load асинхронный. Вместо использования события вы также можете использовать обратный вызов.

store.load(
{ 
    params: {cid:tempId}, 
    callback: function(records, operation, success){ 
     var info = records; 
     console.log(info); 
     console.log(store.proxy.reader.rawData); 
    } 
}); 
Смежные вопросы