2

カスタムヘッダーを使用して、応答データに関する詳細情報を提供したいと思います。オブジェクトストア(dojo 1.7)を介してjsonRestオブジェクトに接続されたdojoデータグリッドからの応答でヘッダーを取得することは可能ですか?これはXHRリクエストを作成しているときに可能だと思いますが、この場合はグリッドによって作成されています。

APIは、応答オブジェクトを返す応答エラーのイベントを提供します。

  on(this.grid, 'FetchError', function (response, req) {
      var header = response.xhr.getAllResponseHeaders();
  });

これを使用して、カスタム応答ヘッダーに正常にアクセスできます。ただし、リクエストが成功したときにレスポンスオブジェクトを取得する方法はないようです。文書化されていないプライベートイベント_onFetchCompleteをアスペクトで使用していますが、これでは応答オブジェクトへのアクセスは許可されず、応答値のみが許可されます。

aspect.after(this.grid, '_onFetchComplete', function (response, request) 
{
 ///unable to get headers, response is the returned values
}, true);

編集:私はなんとか機能するようになりましたが、それは非常に過剰に設計されており、よりよく理解している人がより簡単な解決策を思い付く可能性があると思います。オブジェクトストアに返されるレストストアで遅延オブジェクトを取得できるように、アスペクトを追加することになりました。ここでは、ヘッダーを返すためにdeferedに新しい関数を追加しました。次に、dojoヒッチを使用してオブジェクトストアのonFetchに接続しました(現在のスコープで結果が必要だったため)。散らかっているようです

aspect.around(restStore, "query", function (original) {
    return function (method, args) {
        var def = original.call(this, method, args);
        def.headers = deferred1.then(function () {
            var hd = def.ioArgs.xhr.getResponseHeader("myHeader");
            return hd;
        });
        return def;
    };
});

aspect.after(objectStore, 'onFetch', lang.hitch(this, function (response) {
    response.headers.then(lang.hitch(this, function (evt) {
        var headerResult = evt;
    }));
}), true);

もっと良い方法はありますか?

4

2 に答える 2

2

私はこの投稿を読んだ後、今日これを解決しました、私はフィードバックすると思いました。

dojo/store/JsonRestそれも解決しますが、私のコードは少し異なってしまいました。

var MyStore = declare(JsonRest, {
    query: function () {
        var results = this.inherited(arguments);
        console.log('Results: ', results);
        results.response.then(function (res) {
            var myheader = res.xhr.getResponseHeader('My-Header');
            doSomethingWith(myheader);
        });
        return results;
    }
});

したがって、通常のquery()関数をオーバーライドし、実行してpromiseを返し、独自のリスナーを'response'メンバー解決にアタッチします。このメンバーでは、ヘッダーを持つxhrオブジェクトにアクセスできます。これにより、すべての呼び出し元のquery()のチェーンにうまく適合しながら、JsonRestの結果を解釈できるようになります。

警告の一言ですが、このコードはここに投稿するために変更されており、実際にはこれも上書きされた別の中間クラスから継承されてquery()いますが、ここでの基本はかなり健全です。

于 2013-11-20T11:56:37.763 に答える
0

サーバーから情報を取得することが必要な場合は、Cookieのカスタムキー値も解決策になる可能性があります。これは私の場合で、最初はカスタム応答ヘッダーを探していましたが、機能させることができなかったため、グリッドデータがフェッチされた後、Cookieの方法で情報を取得しましたか?

dojo.connect(grid, "_onFetchComplete", function (){
    doSomethingWith(dojo.cookie("My-Key"));
});

これは、たとえば、現在のページに含まれている行だけでなく、ページ化されたデータグリッドのすべての行のSUM(フィールド)を表示する場合に役立ちます。サーバーでは、COUNTとSUMをフェッチできます。COUNTはContent-Rangeヘッダーで送信され、SUMはCookieで送信されます。

于 2014-08-10T00:55:06.100 に答える