正确使用/实现服务的方法

时间:2015-02-05 18:00:47

标签: angularjs

我们正试图锁定使用服务的最佳方法,并提出了三种可能性。这是一个更大问题的一个小得多的例子,但我希望它得到了重点。这些示例中的服务非常简单:

.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>

我们提出的选择是:

  1. 选项A:http://jsfiddle.net/nxhn31yv/(资产和工具栏都有服务)
  2. 选项B:http://jsfiddle.net/oszop5j4/(资产有服务,工具栏的父级有服务,工具栏会更新)
  3. 选项C:http://jsfiddle.net/a7nf31d3/(所有人的父母都有服务,将其传递下来)
  4. 第一个将服务器注入两个兄弟控制器,其中一个调用切换功能来更新该服务中存储的值。

    第二个选项是将它注入到两个具有父/子关系的服务中。父值将值传递给一个可以更新它的子节点(如ngmodel),而带有注入服务的子控制器将它的值传递给使用它的子节点。

    第三个选项让父母将值一直传递给两个兄弟姐妹,而兄弟姐妹又将一个兄弟姐妹传递给它的孩子。

    其中哪一项符合如何实施服务的角度方法?

3 个答案:

答案 0 :(得分:5)

选项A对我来说是明显的赢家。它更接近于离散的,分离的Web组件的概念 - Angular和Web开发通常看起来的方向。

对于Angular 1.x,这意味着使用指令封装绑定在一起的所有标记/逻辑。通常,您的标记中不应要求ng-controller。应该可以通过仅查看该指令的声明来识别任何指令的依赖关系(注入或相关指令)。

选项B和C违反了这些简单的原则,因此(假设实际实现比这些简单的例子更复杂)在维护和调试方面可能会更加痛苦。

答案 1 :(得分:2)

我会说选项A是最好的方法。

我相信Angular教给你的最好的东西之一是如何模块化你的代码。以这样的方式编程,如果你想,你可以删除,在任何地方添加任何一块。因此,您可以尝试避免使用任何依赖于另一件的东西。您的选项A以这种方式成功。

当然有时它是不可避免的,但我将其作为一般规则使用。它使事情更容易理解和遵循,保持清洁。

编辑:它还可以保护自己免受将来范围的更改。

答案 2 :(得分:1)

根据 Den Odell Pro Javascript开发, 从一个对象直接应用一组方法属性到另一个或类的原型可以是一个&#34; hack&#34;,特别是那些从面向对象的背景接近Angular的开发人员。 毫无疑问,当它被仔细使用时,可以简化开发和代码维护。 这是 mixin 设计模式,避免扩展子类和继承链

将服务注入封装的指令,将帮助您避免父控制器和继承。 这就是为什么我选择选项A,但仔细使用它。

More关于mixin。

Another文章