1

Revealing Module パターンで Angular サービスを使用しています。このサービスは、内部的に Web サービスから文字列リソースを取得し、'Strings' パブリック変数を介してそれらを利用できるようにします。サービス呼び出しが行われる前に参照されるため、プライベート 'strings' 変数を初期化する必要があります。

サービスから適切な文字列データを取得し、それをプライベート 'strings' 変数にコピーします。ただし、クライアントがパブリックの「文字列」を参照する場合、元の値は保持されています。

私が間違っていること、またはパブリックの「文字列」を更新する方法について何か考えはありますか?

'use strict';

io1App.factory('Resources', ['$rootScope', 'DataService', '$q',
function ($rootScope, DataService, $q) {

   var urlBase = '/api/sfc/resource';

    // Need to pre-define 'ERROR_HEADER', since it is referenced in Index.html...before we have a chance to download it from the server.
   var strings = {
       'ERROR_HEADER': 'Error!'
   };

    var getStringResources = function (locale) {

        var url = urlBase + '/' + locale;

        var deferred = $q.defer();

        var promise = DataService.GetMethod(url);

        // Note that DataService.GetMethod(...) is returning a $q promise
        promise.then(function (data) {
            strings = data;
            deferred.resolve();
        },
        function (err) {
            deferred.reject(err);
        });

        return deferred.promise;
    };

    return {
        Strings: strings,
        GetStringResources: getStringResources
    }
}]);

サービス呼び出しは、返されたデータをプライベート 'strings' 変数に設定します。

promise.then(function (data) {
            strings = data;
            deferred.resolve();
        },

非公開の「文字列」に次のものが表示されるようになりました (Chrome 開発者ツール経由):

strings = {
       'ERROR_HEADER': 'Error!'
       'INVALID_PROCESS_ORDER': 'Process Order [%d] could not be entered because it does not belong to Manfacturing Order [%d]',
       'DUPLICATE_PROCESS_ORDER': 'Process Order [%d] already entered.',
       'USER_NOT_ITAR': 'Manufacturing order [%d] is ITAR, and you are not ITAR approved.  You cannot proceed with this order.  Please contact your supervisor.'
   };

それでも、Angular コントローラーでパブリックの「文字列」を参照する場合、「文字列」はまだプライベート「文字列」の元の値を参照しています。

リソース.文字列:

{
   'ERROR_HEADER': 'Error!'
};

助言がありますか?

4

2 に答える 2