次のことを行う正しい方法を知りたいです。サービス、ファクトリ、およびコントローラーがあります。
サービスには、デフォルトselectedTable
で開始されるプロパティがnull
あり、ファクトリとコントローラの両方で使用するために、選択したテーブルを格納するために使用されます。サービスにtouches
は、ファクトリとコントローラーで定期的に更新されるというプロパティもあり、そのサービスは次のようになります。
Module.service('tablesService', function(){
this.data = {
selectedTable: null,
touches: 0
}
});
ファクトリは、変数を設定してサービスを使用し、との値を変更するvar data = tablesService.data
メソッドを持っています。select
data.selectedTable
data.touches
if (data.selectedTable === this){
data.touches++;
if (data.touches === 2) {
data.selectedTable = null;
}
} else {
if (data.selectedTable && data.selectedTable != this) {
data.touches++;
data.selectedTable.select();
}
data.selectedTable = this;
}
コントローラーはすべてのイベントでテーブルのリストを調べonClick
、クリックされたテーブルがそのメソッドを呼び出すことを発見するとselect()
、ファクトリ内のメソッドがクリックされたテーブルが selectedTable である場合、touches
変数が変更されるため、select()
メソッドが呼び出されると、selectedTable
get は次のnull
ようになります。新しい価値。
$scope.tablesData = tablesService.data;
$scope.selectedTable = $scope.tablesData.selectedTable;
$scope.touches = $scope.tablesData.touches;
$scope.findTable = function(event){
$scope.touches = 0;
for(t in $scope.tables) {
var table = $scope.tables[t];
var result = table.findMe(event.offsetX,event.offsetY);
if(result.type === 'table') {
if ($scope.selectedTable === table){
$scope.touches++;
}
table.select();
break;
}
}
問題は、変更$scope.touches
してもサービス内の変数が更新されず、その逆も同様です。これは selectedTable でも発生します。$watch
両方$scope.touches
で使用しようとしまし$scope.tablesData.touches
たが、$digest()
変更するたびにメソッドが起動しないため、どちら$scope.touches
を呼び出す必要があります$apply()
かひどく見え、常に問題を解決するわけではありません。
私のウォッチャーは次のようになります。
$scope.$watch('touches', function(){
$scope.tablesData.touches = $scope.touches;
});
$scope.$watch('tablesData.touches', function(){
$scope.touches = $scope.tablesData.touches;
});
この投稿を読んでhttp://kirkbushell.me/when-to-use-directives-controllers-or-services-in-angular/ $rootScope.$broadcast() 経由でアプリケーションにイベントをブロードキャストできることがわかりました。しかし、それを実装する方法がよくわかりません。おそらく、それは問題を解決するための最良の方法ではありません。