声明控制器的首选方法

时间:2014-05-28 11:12:49

标签: javascript angularjs angularjs-controller

AngularJs中defining a controller的可用方式很少。具体地:

  1. “附加到$scope”语法
  2. “controller as”语法
  3. controller()功能
  4. 以上代码展示:

    // 1)
    ng-controller="MyControllerFn"
    
    // 2)
    ng-controller="MyControllerFn as myCtrl"
    
    // 3)
    myModule.controller("myCtrl", MyControllerFn);
    // or
    myApp.controller("myCtrl", ["$scope", function($scope) {
    
    }]);
    

    当然,每个人都有它的优点和缺点。目前我正在使用选项1)。我的问题是,我不知道我是否在长期内没有遗漏任何东西,现在可以使用新的“控制器为”语法了。我们的项目非常庞大,我看不到自己在一年左右的时间内将所有内容重写为新语法,只是因为旧版本被弃用了。我现在宁愿慢慢过渡,从今天开始以“好方法”编写新代码。

    少有PROS和缺点:

    1)

    • (好)与2)相比较少的样板,因为控制器的自动发现在遇到ng-controller指令时会为您处理声明
    • (差)支持正确的DI:MyControllerFn.$inject = [...]
    • (糟糕)难以在控制器的继承树中导航

    2)

    • (好)控制器别名清楚说明哪些范围变量引用
    • (良好)更清晰的控制器语法,因为将变量分配给this
    • (好)似乎正在改进工具支持(IDE)
    • (坏)容易在范围内添加太多东西时出错,例如:`this.arr = ...; // 1mln项目的数组'

    3)

    • (中立)缩小完成(嗯,这可以用$inject属性完成)
    • (糟糕)更详细的语法,可以通过自动发现完全避免

    好的,我错过了什么吗?也许我没有看到明显的东西,因为我刚刚搬到1.2?


    =编辑

    为清楚起见,绑定和声明控制器之间存在差异。前两个演示的选项是关于将控制器绑定到DOM,而第三个是关于在角度模块中明确声明它。反对后者将允许Angular通过DOM并自动发现控制器,这是我首选的做事方式。

1 个答案:

答案 0 :(得分:0)

直截了当:

首先,需要完成两件不同的事情:

  1. 定义控制器的实现(即" new ed"以创建控制器实例的功能。)
  2. 将控制器绑定到DOM元素(即说"视图的这一部分由控制器实例控制,称为' someCtrl'")。
  3. 然后将Angular的工作联系起来是

    1. 我在视图中看到了元素。
    2. 我看到元素x绑定到控制器y。
    3. 我找到了注册为名为y。
    4. 的控制器实现的函数
    5. 我使用该功能创建了一个新的控制器实例。
    6. 我将新的控制器实例传递给元素(即评估元素及其后代对照该控制器实例的每个Angular表达式 - 除非视图的子树绑定到另一个控制器实例等)。

    7. (1)和(2)是将控制器绑定到DOM元素的方法 除此之外,还有指令的controller属性和ngRoute controller属性,您根本不提及。< / p>

      (3)是一种用Angular的DI注册控制器实现的方法(它负责实例化绑定到特定元素的控制器。
      从这个意义上说,通过函数的名称自动匹配控制器实现(你所谓的(自动发现)是(3)的替代,所以让它命名为(4)。

      根据以上所述,(1)和(2)不是(3)和(4)的替代方法,但它们都是必需的并且相互补充。


      从以上功能,&#34;自动发现&#34;是我想要最少依赖的人 它感觉hacky /不是非常强大&#34;它的目的是减少快速组合小型原型或示例所需的代码,而不是用于大规模的生产应用程序。

      来自Angular的 Developer Guide

        

      注意:虽然Angular允许您在全局范围内创建Controller函数,但不建议这样做。在实际应用程序中,您应该使用Angular模块的.controller方法来处理应用程序[...]


      IMO,真正的争论是关于controller vs contoller as

      以下是一些注意事项:

      1. controller as功能是一项新功能,可能仍处于评估阶段。它可能会留下来,但我不会把所有的钱押在上面。

      2. controller as语法中,没有实际的$scope(即Scope对象,$rootScope等的后代)。这一事实对于您如何执行某些$scope特定内容有一些影响,例如使用$on()注册听众,$watch注册属性等。

      3. controller as语法可能会提高视图的可维护性/可读性,因为它明确了每个属性引用的控制器 - 它避免了通过原型保留,被覆盖等属性的情况。另一方面,原型继承的缺失限制了数据的传播方式。


      4. 也就是说,我稍微偏好controller语法,因为我发现$scope提供的实用程序非常有用,而且在我的项目中找不到任何可用的用例controller as语法更可取。