3

同じモジュールのコントローラーから Angularjs サービス内の変数の値を変更できる必要があります。TL;DR バージョンは以下です...

私は、swagger ファイルで記述された RESTful API を備えた組み込みシステムを持っています。Angularjs アプリ経由でアクセスしています。このアプリを作成するために、swagger-codegen を使用してサービスを自動生成しました。これにより、$http への呼び出しからサービス内で使用されるベースパスがサービスに渡されます。サービスは次のようになります。

API.Client.MyApi = function($http, $httpParamSerializer, $injector) {
  /** @private {!string} */
  this.basePath_ = $injector.has('MyApiBasePath') ?
               /** @type {!string} */ ($injector.get('MyApiBasePath')) :
               'http://localhost/';

  ...

}

angular app.js ファイルには、次のものがあります。

var myApp = angular.module('MyApp', [
])
  .service('MyApi', API.Client.MyApi)
  .value('MyApiBasePath', 'http://192.168.1.128');

これはすべてうまくいきます。ただし、アプリケーション内からデバイスのベースパス (具体的には IP アドレス) を設定できるようにしたいと考えています。しかし、サービスは最初から開始されており、コントローラーがサービス変数 basePath_ を更新できるようにする方法がわかりません。

basepath をパラメーターとして受け入れるようにサービス関数を書き直すことはできますが、swagger-codegen によって自動生成されるサービスは書き直したくありません。

私はどんな解決策にもオープンです - これを行うための全体的な最善の方法についてのアドバイスを探しています.

更新: 2016 年 5 月 24 日 - 誰かが私にスワッガー コードを投稿するように依頼しました。これは、初期サービス関数とメソッドを含むファイルの 1 つの関連部分です...

API.Client.MyApi = function($http, $httpParamSerializer, $injector) {
  /** @private {!string} */
  this.basePath_ = $injector.has('MyApiBasePath') ?
                   /** @type {!string} */ ($injector.get('MyApiBasePath')) :
                   'http://localhost/';

  /** @private {!Object<string, string>} */
  this.defaultHeaders_ = $injector.has('MyApiDefaultHeaders') ?
                   /** @type {!Object<string, string>} */ (
                       $injector.get('MyApiDefaultHeaders')) :
                   {};

  /** @private {!angular.$http} */
  this.http_ = $http;

  /** @private {!Object} */
  this.httpParamSerializer_ = $injector.get('$httpParamSerializer');
}
API.Client.MyApi.$inject = ['$http', '$httpParamSerializer', '$injector'];

/**
 * Thingy Outputs
 * Returns the state of all thingys
 * @param {!angular.$http.Config=} opt_extraHttpRequestParams Extra HTTP parameters to send.
 * @return {!angular.$q.Promise<!Array<!API.Client.boolGetModel>>}
 */
API.Client.MyApi.prototype.thingyGet = function(opt_extraHttpRequestParams) {
  /** @const {string} */
  var path = this.basePath_ + '/thingys';

  /** @type {!Object} */
  var queryParameters = {};

  /** @type {!Object} */
  var headerParams = angular.extend({}, this.defaultHeaders);
  /** @type {!Object} */
  var httpRequestParams = {
    method: 'GET',
    url: path,
    json: true,


    params: queryParameters,
    headers: headerParams
  };

  if (opt_extraHttpRequestParams) {
    httpRequestParams = angular.extend(httpRequestParams, opt_extraHttpRequestParams);
  }

  return this.http_(httpRequestParams);
}
4

1 に答える 1

0

生成されたファクトリを編集する必要はありません。コントローラから直接、swagger-codegen で生成されたファクトリのインスタンスにベース パス URL を割り当てることができます。

swagger-codegen が生成するコンストラクターは次のようになります。

function MyService(options, cache) {
            var domain = (typeof options === 'object') ? options.domain : options;
            this.domain = typeof(domain) === 'string' ? domain : 'http://localhost:8000';
            if (this.domain.length === 0) {
                throw new Error('Domain parameter must be specified as a string.');
            }
            cache = cache || ((typeof options === 'object') ? options.cache : cache);
            this.cache = cache;
        }

次に、コントローラーで、コンストラクターのパラメーターに url を持つオブジェクトをインスタンス化するだけです。

var myServiceObj = new MyService("http://www.pizza.it/api");
于 2016-05-22T23:07:35.333 に答える