“控制器为”vs隔离范围

时间:2014-05-06 13:59:28

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-controller

我想在我的指令中使用'controllerAs'选项。让我引用“An AngularJS Style Guide for Closure Users at Google”的推理:

  

为什么?将方法和属性直接放到控制器上,   而不是建立范围对象,更适合谷歌   关闭类风格。此外,使用'controller as'可以实现   很明显,当多个控制器访问哪个控制器时   适用于元素。因为总有'。'在绑定中,你   不必担心原型继承掩盖原语。

但如果指令具有隔离范围绑定,我可以看到使用此方法的问题。

angular.module('cmw').directive('fooWidget', function() {
    return {
        controller: function() {
            this.qux = '123';
        },
        controllerAs: 'fooWidget',
        scope: {
            bar: '='
        },
        template: ' {{fooWidget.qux}}  {{bar}} '
    };
});

在这种情况下,bar属性附加到作用域,而不附加到控制器,这会导致混淆不一致的情况,即应在不同的位置查找不同的属性。什么是“官方”推荐的解决方法?

更新:请参阅GitHub issue了解相关信息。

1 个答案:

答案 0 :(得分:2)

很难找到这样做的“官方”模式。就个人而言,我认为这取决于你的目标是什么。

如果您想将指令中的信息暴露给外界,请使用隔离范围,因为这是其中的原因之一。 “API”也不必在指令中完全定义,它可以在AngularJS服务中定义,您将其注入指令并通过隔离范围公开,即使您拥有主要关注UI的指令以及处理任何业务逻辑的服务。

如果您在指令之间进行通信,则首选控制器。

但是,为了尝试获取更多官方信息,以下是AngularJS网站上有关使用带指令的控制器的信息:

  

最佳实践:当您希望将API公开给其他指令时,请使用控制器。否则使用链接。

我个人从未见过控制器被用于指令,除了指令到指令通信。我不是说你不能使用它们,我只是没有看到它。此外,如果您想将Controller逻辑暴露给外部世界,那么您将不得不绑定到隔离的范围,所以这一切都取决于您想要做什么。