我想知道执行以下操作的正确方法,我有一个服务,一个工厂和一个控制器。
该服务有一个默认selectedTable
启动的属性,null
它用于存储选定的表,以便在工厂和控制器中使用;该服务还具有touches
在工厂和控制器中定期更新的属性,该服务如下所示:
Module.service('tablesService', function(){
this.data = {
selectedTable: null,
touches: 0
}
});
工厂通过设置变量来使用服务,var data = tablesService.data
并有一个select
修改data.selectedTable
and值的方法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
getnull
为新值。
$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() 向应用程序广播事件,但我不确定如何实现它,也许这不是解决问题的最佳方法。