2

私が今持っているのはこれです:

renderer : function(value) {
    var ret;
    var conn = new Ext.data.Connection();
    conn.request({
        method : 'POST',
        url : rsdBackend,
        params : {
            get_object_by_id : 'true',
            rsd_type : record.data.references_table,
            object_id : value,
            uid : logged_user_id
        },
        success : function(responseObject) {
            var data = Ext.decode(responseObject.responseText);
            ret = data[0].object_name;
        }
    });
    return ret;
}

列に別のデータ (データベース用語では外部キー) へのリンクが含まれている場合、参照先のオブジェクトの名前を表示する必要があります。

したがって、私が考えることができる最善のアプローチは、レンダラーで ajax 呼び出しを使用することです。動作しますが、問題は次のとおりです。どうすれば応答を返すことができますか?

上記のコードは機能しません。原因retは、私がしようとしている場所が未定義ですreturn

どうすればこれを行うことができますか、またはより良い方法がありますか?

4

2 に答える 2

3

このスレッドSencha フォーラムのスレッドに基づく

非同期レンダラーを作成しました。

私の例では、レコードの関連付けの最初のレコードの「名前」の値を表示したいと考えています。

「fileRecord_store()」は私の連想ストアの名前です (「hasMany」アソシエーション モデルで作成)

グリッド パネルでは、次のようなレンダラーを作成できます。

 { header: 'Filename',  dataIndex: 'Files_id',      flex: 2,
    renderer: function(value, meta, record, rowIndex, colIndex, store, view) {
          var divId = 'my_cell_to_update_' + record.id;
          record.columnsNameUpdate(divId);
          return String.format("<div id='" + divId + "'>Loading...</div>"); 
                }
},

そして今、モデルクラスにこの関数を追加します:

columnsNameUpdate : function(divId){

    this.fileRecord_store().on('load', this.updateColumn,this, {divId : divId});
    this.fileRecord_store().load();
},

updateColumn : function(store, model, success, options){
    this.fileRecord_store().un('load', this.updateColumn,this);
    Ext.fly(options.divId).update(store.first().get('filename')); 
}

それは私にとってはうまくいきます!

于 2012-07-20T15:22:42.810 に答える
2

私はあなたがこの方法でこれを行うことができるとは思わない. Ajax 呼び出しは非同期で、renderer()関数は同期です。どうやってそれを混ぜ合わせることができるのか、今は想像できません。

グリッドをレンダリングする前に、関数に必要なすべての情報を取得する必要がありrenderer()ます (すべてのセルに対して!)。追加のストアを作成し、ロードしてから使用できないのはなぜですか?

于 2012-04-26T11:54:11.687 に答える