有两种模式用于访问控制器函数:this和$scope。

我应该什么时候用哪种?我知道这是设置为控制器和$scope是视图作用域链中的对象。但是有了新的“Controller as Var”语法,你可以很容易地使用其中任何一种。所以我的问题是什么是最好的,未来的方向是什么?

例子:

使用这个 函数UserCtrl() { 这一点。Bye = function() {alert('....');}; } <body ng-controller='UserCtrl as uCtrl'> <按钮ng-click = ' uCtrl.bye() >再见> < /按钮 使用美元的范围 函数UserCtrl($scope) { 美元的范围。Bye = function () {alert('....');}; } <身体ng-controller = ' UserCtrl ' > <按钮ng-click = '再见()' >再见> < /按钮

我个人认为,与其他Javascript OO模式相比,this.name更容易理解,也更自然。

建议好吗?


当前回答

Angular文档明确地告诉你,建议使用这个方法。除了$scope被删除这一事实外,这足以让我永远不使用$scope。

其他回答

我喜欢组合。

在用一些模拟数据填充它们之后,一个简单的console.log的$scope和'this'将显示这一点。

$scope允许访问控制器的隐藏部分,例如:

$$ChildScope: null;
$$childHead: null;
$$childTail: null;
$$listenerCount: Object;
$$listeners: Object;
$$nextSibling: Scope;
$$prevSibling: null;
$$watchers: null;
$$watcherCount: 0;
$id: 2;
$parent: Object;
foo: 'bar';

** Angular团队不建议使用$$的属性和方法,但是$可以安全地使用$parent和$id来做一些很酷的事情。

“this”直奔主题,附加2向绑定的数据和函数。你只会看到你附上的东西:

foo: 'bar';

那么为什么我更喜欢一种组合呢?

在ui-router嵌套的应用程序中,我可以访问主控制器,设置和调用子控制器中的通用值和函数:

在主控制器中:

// Main Controller
var mainCtrl = this;
mainCtrl.foo = 'Parent at the bar';

在子控制器中:

// Child Controller
var mainCtrl = $scope.$parent.mainCtrl;
var childCtrl = this;

// update the parent from within the child
childCtrl.underageDrinking = function(){
    mainCtrl.foo = 'Child at the bar';
}

// And then attach the child back to a property on the parent controller!
mainCtrl.currentCtrl = childCtrl;

现在,您可以从子对象中访问父对象,从父对象中访问子对象!

Angular文档明确地告诉你,建议使用这个方法。除了$scope被删除这一事实外,这足以让我永远不使用$scope。

jason328的“$scope将在Angular 2.0中被移除”对我来说听起来是个很好的理由。我发现了另一个帮助我做出选择的原因:当我看到fooCtrl时,这个更可读。bar在HTML中,我立即知道在哪里找到bar的定义。

更新:在切换到这个解决方案后不久,我开始怀念需要更少输入的$scope方式

我认为控制器As更好,因为它允许更容易地嵌套作用域,如Todd Motto所述:

http://toddmotto.com/digging-into-angulars-controller-as-syntax/

而且,它将确保你总是至少有一个。在你的绑定表达式中强制你遵循不要绑定到原语的建议。

另外,你还可以与作用域解耦,这在2.0中将会消失。

$scope在Angular 2.0中被移除。因此,随着Angular 2.0发布日期的临近,使用这种方法将是其他人想要效仿的方法。