9

私のAngularアプリケーションの周りにいくつかの$resourcesといくつかの$httpがあるとしましょう:

myApp.factory('Note', function($resource) {

  return $resource('http://', {id: '@id'}, 
    { 'index': { method: 'GET', isArray: true },
      'update': { method: 'PUT'},
    });
  });

コントローラー付き

myApp.controller('NotesController',function NotesController($scope, Note, AuthenticationService) {

$scope.notes = Note.index({}, function(data){
    console.log('success, got data: ', data);
    $scope.response = "yoy!"
  }, function(err){
    console.log('error, got data: ', err);
    $scope.response = "yay!"
  }); 
});

一部のリクエストは、認証のように$httpによって直接行われます。

var request = $http.post('http://', {email: email, password: password});

実際のリクエストが行われる/レスポンスが受信される前に、JSONをbase64にデフレートおよびエンコード/デコードするようにAngularに指示する場所と方法を教えてください。

私は、デフレートとエンコード/デコードのために外部ライブラリをファクトリにラップするかどうかを質問します。そして、この工場はどこかに注入されますか?$ httpBackendのように?

4

3 に答える 3

9

サービスのリクエスト/レスポンストランスフォーマーを確認する必要があります:http: //docs.angularjs.org/api/ng.$http$http

要求/応答トランスフォーマーは、コンテンツが呼び出し元に送信/返送される前に呼び出すことができる単純な関数です。変換関数をグローバルに(すべての要求/応答に対して)指定することも、要求ごとに指定することもできます。

これらの変換をローカルでオーバーライドするには、構成オブジェクトのtransformRequestおよび/またはtransformResponseプロパティとして変換関数を指定します。デフォルトの変換をグローバルにオーバーライドするには、$httpProviderの$httpProvider.defaults.transformRequestプロパティと$httpProvider.defaults.transformResponseプロパティをオーバーライドします。

グローバルな要求/応答トランスフォーマーを定義するには、これらの行に沿ってコードを記述します(疑似コードに似ており、すべてのブラウザーで機能するわけではありません。以下のBase64に関する注記を参照してください)。

angular.module('sample', [], function($httpProvider) {

    $httpProvider.defaults.transformRequest = function(data, headersGetter) {
        return btoa(JSON.stringify(data));
    };

    $httpProvider.defaults.transformResponse = function(data, headersGetter) {
        return JSON.parse(atob(data));
    };

})

もちろん、変換コードはより洗練されていて、要求/応答ヘッダーに依存する可能性がありますが、一般的な考え方はここにあります。コードを含むjsFiddle(コンソールをチェックしてリクエストが変換されることを確認します。MozillaまたはWebKitブラウザーを使用する必要があります):http://jsfiddle.net/Ydt5j/

/からBase64への実際の変換については、次の質問を確認してください。JavaScriptで文字列をBase64にエンコードするにはどうすればよいですか。

于 2012-12-30T12:40:19.660 に答える
2
angular.module('services.base64',[]);
angular.module('services.base64').provider('base64', function () {

  this.encode = function(str) {
    return base64_encode(str);
  }

  this.decode = function(str) {
    return base64_decode(str);
  }

  this.$get = function() {
    return {};
  }

});

var myApp = angular.module('myApp',['services.base64'])

myApp.config(['base64Provider', function (base64Provider) {
    $httpProvider.defaults.transformRequest = function(request){return base64Provider.encode(request)};

    $httpProvider.defaults.transformResponse = function(response){return base64Provider.decode(response)};
}]);
于 2012-12-31T19:25:24.157 に答える
1

これは私がフィルターで行う方法です。item.htmlBodyには、htmlタグ付きのbase64エンコードテキストが含まれています

// in template
<div ng-bind-html="item.htmlBody | decodeBase64">{{item.htmlBody}}</div>

//inside controller.js

.filter('decodeBase64', function(){
   return function(text){
   return atob(text);
   }
})

まあ、これは質問に正確に答えないことを私は知っていますが、いくつかのマイナーな調整で、あなたはあなたが望むものを手に入れることができます(同じ問題を持つ将来の人をターゲットにする)

于 2014-09-04T03:16:21.560 に答える