0

次の問題があります。いくつかの変数を持つJSファイルがあります。関数で初期化するもの:

var currentYear;
var previousYear;
var urlQuarterDates;
var urlHalfYear;
var urlYear;
var urlMonth;
var urlProposalsSentAndReceived; //= '/Marketing/ListProposalsSentAndReceived';
var urlProposalsResponsibleMonth;

function initTabReportProposalsMonth(_currentYear, _previousYear, _urlViewProposal,
_urlQuarterDates, _urlHalfYear, _urlYear, _urlMonth, _urlProposalsSentAndReceived, 
_urlProposalsResponsibleMonth) {
    currentYear = _currentYear;
    previousYear = _previousYear;
    urlQuarterDates = _urlQuarterDates;
    urlHalfYear = _urlHalfYear;
    urlYear = _urlYear;
    urlMonth = _urlMonth;
    urlProposalsSentAndReceived = _urlProposalsSentAndReceived;
    urlProposalsResponsibleMonth = _urlProposalsResponsibleMonth;
}

同じ JS ファイルでイベント ハンドラーを定義しました。

function onPeriodSelect(combo, rec, i) {
    var conn = new Ext.data.Connection();
    var params = { }; 
    switch(rec.get('myId'))
    {
        case _currentQuarter1:
            conn.url = urlQuarterDates;
            params.y = currentYear;
            params.index = 1;
            break;
    }
    reload(); //
}

変数 urlQuarterDates と currentYear には簡単にアクセスできます。ここまでは順調ですね...

インラインで宣言されたデータ ストアを持つ ExtJs Grid もあります。

var gridSentAndReceived = new Ext.grid.GridPanel({
    title: 'Totaal',
    autoHeight: true,
    autoWidth: true,
    store: new Ext.data.Store({
        id: 'idStoreSentAndReceived',
        proxy: new Ext.data.HttpProxy({ url: urlProposalsSentAndReceived, 
            timeout: 1800000 }),
        reader: new Ext.data.JsonReader(
            {
                root: 'rows'
            },
            [
                { name: 'Status' },
                { name: 'nrOfProposals' },
                { name: 'TotalRevenueHardware' },
                { name: 'TotalRevenueYearly' },
                { name: 'TotalRevenueHours' }
            ]),
        remoteSort: false
    }),
    frame: true,
    iconCls: 'icon-grid',
        columns: [
        ...   
    ],
    viewConfig: {
        forceFit: true
    }
});

reload() 関数は、gridSentAndReceived のストアのロードを呼び出します。これにより例外が生成されます。URL がまったく定義されていません。宣言でURLを初期化すると(現在コメントアウトされています)、正常に動作します。デバッガーを使用して参照すると、urlProposalsSentAndReceived初期化されていることが示されます。それでも、URLがないと主張します。

変数はイベント ハンドラーからアクセスできますが、他の場所では明らかにアクセスできないため、これはスコープの問題のようです。誰もそれを修正する方法を知っていますか? URL はサーバー タグを使用して作成され、それらを JS ファイルに配置することはできません。それらをテキスト文字列としてJSファイルに直接入れるのは好きではありません。可能な解決策はありますか?

アップデート

さらにいくつか試してみましたが、何も機能しません。

私が試してみました:

'beforeload': function (store, options) {
    store.proxy.setUrl('/Marketing/ListProposalsSentAndReceived');
}

しかし、それでもうまくいきませんでした。それでも同じ例外が発生しました。なぜそれが失敗したのか、私にはまったくわかりませんが、 「api」の下のExtJsドキュメントからコードを取得しました。

サーバータグを使用して動的に追加することを非常に好みますが、jsファイルにURLをハードコーディングする以外に選択肢はありません。願わくば、いつの日か、コントローラー アクションの場所を変更したときに実行時エラーが発生するのではなく、解決策が見つかることを願っています。

4

1 に答える 1

0

これはスコープの問題ではありません。コードを実行する時点では、コードurlProposalsSentAndReceivedは定義されていません。イベント ハンドラーを介してその変数を設定する場合、値は常にgridSentAndReceived初期化後に設定されます。

于 2013-01-16T13:03:26.120 に答える