角度控制器作为语法,特殊场合还需要$ scope吗?

时间:2015-04-23 12:27:31

标签: javascript angularjs angularjs-scope

我使用angular的'controller as somename'语法。

让我们说以下功能是我的控制器

function myCOntroller($scope)
{
  $scope.$emit('event');
}

以上功能正常。我尝试过如下

function myController()
{
  var reference = this;
  reference.$emit('event');
}

这不起作用。什么时候我可以使用引用进行数据绑定。为什么我不能用它来做这类事情。我认为引用现在具有$ scope所具有的所有功能。如果$ emit以这种方式工作会不会有意义?

  

注意:抱歉代码示例。我只是问这个问题   概念证明,所以没有任何真实的代码。

2 个答案:

答案 0 :(得分:1)

如前所述here

'Controller as'是一种语法糖,在1.2中引入并试图修复$ scope的经验(至少其部分受到范围原型继承的不良影响)。

<body ng-controller="MyCtrl as myCtrl">
...
app.controller('MyCtrl', function () {
  ...
});

相同
<body ng-controller="MyCtrl">
...
app.controller('MyCtrl', function ($scope) {
  $scope.myCtrl = this;
  ...
});

它不会消除对范围的需要,但会在控制器中引入有用的模式(请注意,您不需要在前一个示例中注入$ scope,除非您需要$ scope。$ on等)。

因此,当您希望它充当模型时,请使用this代替$scope

答案 1 :(得分:1)

“controllerAs”不会生成this == $scope

controllerAs之前使用最佳实践,控制器应该已经使用范围。

angular.module("myApp")
.controller("myController", ["$scope", function MyController ( $scope ) {
    var myControl = { data: 123 };
    $scope.myControl = myControl;
}]);

HTML看起来像

<div ng-controller="myController">{{ myControl.data }}</div>

使用controllerAsthis是控制器(不是$scope),这意味着您无需在$scope上放置任何内容,而您可以在大多数情况下,忽略它,除非你有特定的需要(事件,带有属性的指令等)。

this.$scope == $scope

angular.module("myApp")
.controller("myController", [function MyController ( ) {
    var myController = angular.extend(this, { data: 123 });
    myController.$scope.$emit( /* ... */ );
}]);

让你写

<div ng-controller="myController as myControl">
    {{ myControl.data }} <!-- === $scope.myControl.data -->
   <!-- "as" sets the name of the controller, on the scope -->
   <!-- $scope.myControl.$scope === $scope -->
</div>