2015-10-19 113 views
1

我现在有2个指令:如何在服务之间进行双向通信?

<div ng-controller="indexViewModel"> 
    <div class="row"> 
     <searchfilters></searchfilters> 
    </div> 
    <div class="row top-buffer"> 
     <searchfields></searchfields> 
    </div> 
</div> 

他们都有指定的templateUrl,并调用处理每一个有项目列表2个独立的服务。

var SearchFiltersService= angular.module('SearchFiltersService', []) 
.service('SearchFilters', function() { 
    this.MyList = []; 
    return this; 
}); 

var SearchFieldsService= angular.module('SearchFieldsService', []) 
.service('SearchFields', function() { 
    this.MyList = []; 
    return this; 
}); 

我不想提供太多的代码,因为我想我可能会错误地想到这个问题。我遇到了其他问题的周期性依赖问题。

怎样才可以有2个模板,每个都有一个服务,每个服务可以添加和删除项目(项目作为其唯一的财产只是一个列表),将在其他服务(以及其他的体现视图)?

+4

最佳做法是可能同时拥有您的指令依赖于一个单一的共享服务,而不是两个独立但高度相互依存服务。 –

+0

@DanielBeck我尝试了类似的东西,但服务之间的列表并不完全相同。但是,它们都需要能够修改彼此的列表。这个实例中的单个共享服务是否应该为每个共享服务列出两个列表,并且它们都调用这个服务,这将修改这两个列表? – tic

+0

我想,取决于不同但相关的列表的目的,但通常情况下,您希望尽可能减少组件之间的相关性。如果是“添加到列表A的任何东西也应该添加到列表B”,那么您肯定会希望单个服务管理这两个列表。 –

回答

0

由于Daniel Beck的意见,对于如何处理2个服务,需要将数据互相沟通,在这种情况下2只列出了一个很好的答案。 下面显示了可以处理添加项目的共享服务,然后可以实施更多逻辑以根据项目插入到的子服务来更改列表。

var SearchSharedService= angular.module('SearchSharedService', ['SearchFiltersService', 'SearchFieldsService']) 
.service('SearchShared', function (SearchFilters, SearchFields) { 

    this.addFilter = function(filter) { 
     //Perform logic to change filterto desired format for each child service 
     SearchFilters.myList.push(filter); 
     SearchFields.myList.push(filter); 
    }; 

    this.addField = function(field) { 
     //Perform logic to change field to desired format for each child service 
     SearchFilters.myList.push(field); 
     SearchFields.myList.push(field); 
    }; 
    return this; 
}); 

var SearchFiltersService= angular.module('SearchFiltersService', []) 
.service('SearchFilters', function() { 
    this.myList = []; 
    return this; 
}); 

var SearchFieldsService= angular.module('SearchFieldsService', []) 
.service('SearchFields', function() { 
    this.myList = []; 
    return this; 
}); 

注意:共享服务将需要包括你的模块在这里

var app = angular.module('myApp', ['SearchSharedService']); 
相关问题