0

ストアがロードされたときに初期化する必要があり、次のように別のストアでその値を使用する必要があるグローバル変数があります

var cp = 0;

Ext.onReady(function() {
    Ext.define('Init', {
        singleton: true,
        cp: 0
    });

    Ext.define('loggedUserList', {
        extend: 'Ext.data.Model',
        fields: [
            'id',
            'name'
        ]
    });

    loggedUser = Ext.create('Ext.data.Store', {
        model: 'loggedUserList',
        autoLoad: true,
        proxy: {
        type: 'ajax',
        url: url+'/lochweb/loch/users/getLoggedUser',
        reader: {
            type: 'json',
            root: 'provider'
        },
        listeners: {
            load: function(loggedUser) {
                Init.cp = loggedUser.getAt(0).data.id;
            }
        }
    }); 
});

私は次のように別のURLでcpの値を使用しています:url: url + '/lochweb/loch/vocabulary/getVocabularyByProvider?providerId=' + Init.cp,

Ext.define('vocbList', {
    extend: 'Ext.data.Model',
    fields: [
        {
            name: 'id',
            mapping: 'id'
        },
        {
            name: 'code',
            mapping: 'code'
        }
    ]
});

var vocabulary = Ext.create('Ext.data.Store', {             
    model: 'vocbList',
    autoLoad: true,
    proxy: {
        type: 'ajax',                   
        url: url+'/lochweb/loch/vocabulary/getVocabularyByProvider?providerId='+Init.cp,                    
        reader: {
            type: 'json',
            root: 'Vocabulary'
        }
    }
});

しかし、その値はまだ0です。(cp、Init.cp)を使用してみました。再利用できるようにバリューフォームストアを割り当てるにはどうすればよいですか?

ありがとう

4

2 に答える 2

4

ストアはデータを非同期でロードするため、他のストアがロードされる前にInit.cpが新しい値で初期化されることを確認できません。これで試してください:

var cp=0;

Ext.onReady(function(){
Ext.define('Init', {
    singleton: true,
    cp: 0
});

Ext.define('vocbList', {
            extend: 'Ext.data.Model',
            fields: [
                { name: 'id', mapping: 'id' },
                { name: 'code', mapping: 'code' }

            ]
        });



    var vocabulary = Ext.create('Ext.data.Store', {             
        model: 'vocbList',
        proxy: {
            type: 'ajax',                                   
            reader:  {
                type: 'json',
                root: 'Vocabulary'
            }
        }

Ext.define('loggedUserList', {
                extend: 'Ext.data.Model',
                fields: ['id','name']
            });

            loggedUser = Ext.create('Ext.data.Store', {
                model: 'loggedUserList',
                autoLoad: true,
                proxy: {
                    type: 'ajax',
                    url : url+'/lochweb/loch/users/getLoggedUser',
                    reader: {
                     type: 'json',
                        root: 'provider'
                    }                   
                },
                listeners: {
                    load:function(loggedUser){
                        Init.cp = loggedUser.getAt(0).data.id;
                        vocabulary.getProxy().url = url+'/lochweb/loch/vocabulary/getVocabularyByProvider?providerId='+Init.cp;
                        vocabulary.load();
                    }
                }

            }); 
});

ご覧のとおり、最初のストアがロードされた直後に語彙プロキシのURLを動的に設定してから、ストアをロードする必要があります。

Cyaz

于 2012-05-06T12:28:19.990 に答える
0

ここでloggedUser = Ext.create('Ext.data.Store', { model: 'loggedUserList', autoLoad: true,...}は、Init.cpでload()のデータが割り当てられていることを宣言します。ただし、変数を宣言するときにInit.cpが実際に値を持っていることを確認することはできませんvocabulary(つまり、loggedUserがまだ完全にロードされていない可能性があります)。したがって、URLではまだ0です。

vocbList確認するには、のコードをvocabulary関数に移動する必要があります。

function vocabularyLoad() {
   Ext.define('vocbList', {...});
   var vocabulary = ...
}

このように関数を使用しますloggedUser

loggedUser = Ext.create('Ext.data.Store', {
    ...
    listeners: {
         load:function(loggedUser){
              Init.cp = loggedUser.getAt(0).data.id;
              vocabularyLoad();
         }
    }
 });

ただし、実際には、このリファクタリングにより、の値を定義された関数にInit.cp直接渡すことができるため、割り当てが冗長になります。loggedUser.getAt(0).data.id

于 2012-05-06T08:55:42.793 に答える