为什么要将Angular控制器实例发布到范围属性中?

时间:2013-12-12 23:28:37

标签: javascript angularjs

在最近的1.2.x角度版本(可能也更旧)中,可以使用表达式

初始化控制器
<div ng-controller="demoController as vm"></div>

文档解释如下:

  

控制器实例可以通过发布到范围属性中   指定为propertyName。

http://code.angularjs.org/1.2.4/docs/api/ng.directive:ngController

这在哪些情况下有帮助?

2 个答案:

答案 0 :(得分:1)

控制器使用new进行实例化,因此它是一个原型对象。意思是它可以有原型方法。但是,从视图中调用这些方法作为未绑定方法,并将“this”设置为范围。这在很大程度上违背了它作为原型对象的目的,因为方法中的“this”无法到达对象实例。

实际上有一些来回此... Angular pre-1.0使用“this”作为控制器实例,我忘记了它是如何工作的,也许控制器实例和范围是同一个。使用Angular 1.2+,它有点回归那种风格,将控制器函数更多地视为构造函数而不仅仅是函数集合。

在这个新的1.2样式中,你只需要向作用域添加一个东西(控制器实例)并引用它的所有数据。这样做的好处是可以使用带有原型方法的“类似”构造函数形式的控制器,并且可以方便地解决写入超出实现范围的范围内的ng模型的常见问题。解决方法是在左值表达式的某处包含一个点。

答案 1 :(得分:0)

使用控制器作为语法有一些优点:

  • 如果您使用的是typescriptcoffeescript这样的语言,那么您可以轻松地为您的控制器使用一个类:

    //TypeScript example
    class MyCtrl {
        name: string = "";
    
        constructor(private $log) {
            $log.info("Initializing MyCtrl");
        }
    
        doSomething() {
            this.name = "foo"
        }
    }
    

    示例视图

    <div ng-controller="MyCtrl as ctrl"> 
        <span ng-click="ctrl.doSomething()">{{ctrl.name}}</span>
    </div>
    

    即使您没有使用coffeescripttypescript,您也可以使用原型做同样的事情....它看起来有点丑陋。

  • 如果视图中有多个控制器,那么使用“controller as”语法将确保您没有任何命名冲突

  • 对于使用$ scope的角度初学者来说可能会让人感到困惑