これを解決するために別のアプローチを選択しました。良くなるかどうかわかりませんが、とにかくここに置きます。
(function(utility) {
angular.module('app').
service('data',['$q', function($q) {
var deferred = $q.defer();
var data = ['bla', 'bla'];
//some async $http stuff being done resulting in deferred.resolve(data)
utility.add = function(stuff) {
data.push(stuff);
};
return deferred.promise;
}]).
service('dataService', [function() {
return {
add: function(data) {
utility.add(data);
};
}]);
}({}));
基本的に、私の配列に興味があるコントローラーはすべてdata注入され、私の配列に何かを追加することに潜在的に興味があるコントローラーはdataService注入されます。次に、配列に要素をプッシュutilityする関数を含むオブジェクトに対してクロージャーを作成します。addプロミスは元の配列への参照を保持し、元の配列を変更すると解決された値が実際に更新されるため、これは (少なくとも 1.0.8 では) 機能します。
このようにして、 mycontrollerは から完全に分離$httpされ、サーバーからデータが取得される方法に関与する必要はありません。データを依存関係として宣言することによって引き渡されるだけであり、追加される方法を完全に制御できます。サービスはシングルトンですが、コントローラーはシングルトンではないため、データもキャッシュされます。