次のように定義された単一のサービスがあります。
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
戻す可能性があります。
他にどのようなアプローチがありますか?