0

次のように定義された単一のサービスがあります。

 angular.module('myApp')
     .factory('myService', function ($resource, $q) {
         mySource = [];
         EndPoint = $resource('/my/api/endpoint', {});
         return({
              getSourceAsFunction: function(){
                  return(mySource);
              }
              ,getSourceAsValue: mySource,
              ,setSource: function(newSource){
                     mySource=newSource;
              }
              ,fetchSource: function(attributes){
                  request = $q.defer
                  EndPoint.get(attributes
                  ,function(success){
                          request.resolve(success.data);
                          //mySource['headersArray'] = success.data['headersArray'];
                          //mySource['footersArray'] = success.data['footersArray'];
                  },function(failure){
                          request.reject(failure);
                  });
                  request.promise
           });
      });

このサービスは、複数のコントローラーのさまざまなディレクティブに挿入されます (一部のディレクティブには、isolate スコープがあります)。それらのうちの 1 つのみ (現時点では) で、フェッチ (および結果セット) 操作が実際に実行されますが、フェッチ操作はユーザーがクリック インタラクションによって繰り返し実行される可能性があります。

他のコントローラーは次のようにバインドします。

      $scope.fooVar = myService.getSourceasValue;

また

      $scope.fooVar = myService.getSourceAsFunction();

どちらの場合も、サービスの値が変更されても、変数は自動的に更新されません。

$watch次のように設定します。

       $scope.$watch('fooVar', function(newVal, oldVal){console.log('hi')}, true);

また、トリガーすることはありません (両方の場合)。

リソース コールバックの 2 つのコメント行:

       //mySource['headersArray'] = success.data['headersArray'];
       //mySource['footersArray'] = success.data['footersArray'];

mySource はその時点で としてインスタンス化されまし{}た。これで問題は解決しませんでした。

同じオブジェクトを再利用しようとした前回の試みでした。

この制限を回避するために私が見つけた 1 つの方法は、次のように $watch を設定することです。

       $scope.$watch(function(){return(myService.getSourceAsFunction())}
                  , function(newVal, oldVal){console.log('hi'), true)};

ただし、この機能をバックグラウンドで継続的に実行したくないので、これは心配です。(それはどのように機能しますか? その関数はどのくらいの頻度で実行されますか?$digestそのトリガーは何回反復されますか? そのソリューションはどれほど (非) 効率的ですか?)

どうすればこれを回避できますか? 「参照によって」サービス変数にバインドするにはどうすればよいですか?

より良いアプローチがあるかもしれませんか?私はイベントを試みましたが、これらの要素のいくつかは兄弟であるため、非常に複雑なチェーンになり、子が$emit共同の親のリスナーにイベントをキャッチさせて元に$broadcast戻す可能性があります。

他にどのようなアプローチがありますか?

4

2 に答える 2

2

できることは、サービスをスコープ IE $scope.myService = myService の下に設定すると、HTML から直接アクセスできるようになります。

また、$scope をサービスに送信する必要があるため、データが取得されたら $scope.$apply() を実行できます。

現在の問題は、コントローラーの初期化時に設定していることです。コントローラは再度初期化されないため、更新されません。

$watch は、スコープが $digest された後にのみ更新されます。こちらのドキュメントをご覧ください

于 2013-06-19T07:31:38.647 に答える