angular では、サービスを介してアプリケーション全体に公開されるオブジェクトがあります。
そのオブジェクトのフィールドの一部は動的であり、サービスを使用するコントローラーのバインディングによって通常どおり更新されます。ただし、一部のフィールドは計算されたプロパティであり、他のフィールドに依存し、動的に更新する必要があります。
簡単な例を次に示します (これは jsbin hereで動作しています)。私のサービス モデルは fieldsa
を公開b
し、c
wherec
は in から計算さa + B
れcalcC()
ます。私の実際のアプリケーションでは、計算はもっと複雑ですが、本質はここにあります。
これを機能させるために考えられる唯一の方法は、サービス モデルを にバインドし、$rootScope
を使用$rootScope.$watch
して、コントローラーの変更を監視するか、コントローラーが変更さa
れb
たときに を再計算することですc
。しかし、それは醜いようです。これを行うより良い方法はありますか?
2 つ目の懸念事項は、パフォーマンスです。私の完全なアプリケーションa
でb
は、 と は、 に集約されるオブジェクトの大きなリストですc
。これは、$rootScope.$watch
関数が多くの深い配列チェックを行うことを意味し、パフォーマンスが低下するように聞こえます。
私はこれをBackBoneのイベント化されたアプローチですべて機能させています。これにより、再計算が可能な限り削減されますが、角度はイベント化されたアプローチではうまく機能しないようです。それについての考えも素晴らしいでしょう。
これがアプリケーションの例です。
var myModule = angular.module('myModule', []);
//A service providing a model available to multiple controllers
myModule.factory('aModel', function($rootScope) {
var myModel = {
a: 10,
b: 10,
c: null
};
//compute c from a and b
calcC = function() {
myModel.c = parseInt(myModel.a, 10) * parseInt(myModel.b, 10);
};
$rootScope.myModel = myModel;
$rootScope.$watch('myModel.a', calcC);
$rootScope.$watch('myModel.b', calcC);
return myModel;
});
myModule.controller('oneCtrl', function($scope, aModel) {
$scope.aModel = aModel;
});
myModule.controller('twoCtrl', function($scope, aModel) {
$scope.anotherModel = aModel;
});