0

我想知道执行以下操作的正确方法,我有一个服务,一个工厂和一个控制器。

该服务有一个默认selectedTable启动的属性,null它用于存储选定的表,以便在工厂和控制器中使用;该服务还具有touches在工厂和控制器中定期更新的属性,该服务如下所示:

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

工厂通过设置变量来使用服务,var data = tablesService.data并有一个select修改data.selectedTableand值的方法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()调用它的方法时,selectedTablegetnull为新值。

$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()which看起来很糟糕,并不能一直解决问题。

我的观察者看起来像这样:

$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