我们正试图锁定使用服务的最佳方法,并提出了三种可能性。这是一个更大问题的一个小得多的例子,但我希望它得到了重点。这些示例中的服务非常简单:
.service("markerService", function(){
var self = this;
self.showMarkers = false;
self.toggleMarkers = function(value){
self.showMarkers = angular.isDefined(value) ? !!value : !self.showMarkers;
};
})
编译后的dom也非常简单:
<div ng-controller="ParentCtrl" class="ng-scope">
<div class="assetsDirective">
<div>
<div class="assetDirective">Hidden Name: 1</div>
<div class="assetDirective">Hidden Name: 2</div>
</div>
</div>
<div class="toolBarDirective">
<div>
<button>Toggle Markers</button>
</div>
</div>
</div>
我们提出的选择是:
第一个将服务器注入两个兄弟控制器,其中一个调用切换功能来更新该服务中存储的值。
第二个选项是将它注入到两个具有父/子关系的服务中。父值将值传递给一个可以更新它的子节点(如ngmodel),而带有注入服务的子控制器将它的值传递给使用它的子节点。
第三个选项让父母将值一直传递给两个兄弟姐妹,而兄弟姐妹又将一个兄弟姐妹传递给它的孩子。
其中哪一项符合如何实施服务的角度方法?
答案 0 :(得分:5)
选项A对我来说是明显的赢家。它更接近于离散的,分离的Web组件的概念 - Angular和Web开发通常看起来的方向。
对于Angular 1.x,这意味着使用指令封装绑定在一起的所有标记/逻辑。通常,您的标记中不应要求ng-controller
。应该可以通过仅查看该指令的声明来识别任何指令的依赖关系(注入或相关指令)。
选项B和C违反了这些简单的原则,因此(假设实际实现比这些简单的例子更复杂)在维护和调试方面可能会更加痛苦。
答案 1 :(得分:2)
我会说选项A是最好的方法。
我相信Angular教给你的最好的东西之一是如何模块化你的代码。以这样的方式编程,如果你想,你可以删除,在任何地方添加任何一块。因此,您可以尝试避免使用任何依赖于另一件的东西。您的选项A以这种方式成功。
当然有时它是不可避免的,但我将其作为一般规则使用。它使事情更容易理解和遵循,保持清洁。
编辑:它还可以保护自己免受将来范围的更改。
答案 2 :(得分:1)