0

次のことを行う正しい方法を知りたいです。サービス、ファクトリ、およびコントローラーがあります。

サービスには、デフォルトselectedTableで開始されるプロパティがnullあり、ファクトリとコントローラの両方で使用するために、選択したテーブルを格納するために使用されます。サービスにtouchesは、ファクトリとコントローラーで定期的に更新されるというプロパティもあり、そのサービスは次のようになります。

Module.service('tablesService', function(){
    this.data = {
        selectedTable: null,
        touches: 0
    }
});

ファクトリは、変数を設定してサービスを使用し、との値を変更するvar data = tablesService.dataメソッドを持っています。selectdata.selectedTabledata.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()メソッドが呼び出されると、selectedTableget は次の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() 経由でアプリケーションにイベントをブロードキャストできることがわかりました。しかし、それを実装する方法がよくわかりません。おそらく、それは問題を解決するための最良の方法ではありません。

4

0 に答える 0