【问题标题】:"controller as" vs isolate scope“控制器作为”与隔离范围
【发布时间】:2014-06-23 04:39:03
【问题描述】:

我想在我的指令中使用“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 了解此内容。

【问题讨论】:

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


    【解决方案1】:

    在 Angular 1.3 中通过将 bindToController 属性添加到 directive API 来解决此问题。

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      我个人从未见过在指令中使用控制器,除了指令到指令的通信。我不是说你不能使用它们,我只是没见过。此外,如果您想将 Controller 逻辑暴露给外部世界,那么无论如何您都必须绑定到隔离作用域,所以这完全取决于您想要做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多