2015-04-23 52 views
0

我正在使用angular's'controller as somename'语法。

假设下面这个函数是我的控制器

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

上述功能正在工作。我试过像下面这样

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

这是行不通的。当我可以使用数据绑定的参考。为什么我不能用它来做这种事情。我认为现在引用了$ scope的所有函数。如果$放出这种方式工作是不是有意义?

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

+1

'$ scope'并不是控制器本身。 – Michael

回答

1

如前所述here

“控制器”是在1.2推出,并试图修复从$范围从的不良影响所遭受的经验(它至少部分语法糖范围原型继承)。

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

是相同的

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

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

因此,当您希望它充当模型时,请使用this而不是$scope

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> 
+0

'this。$ scope'是未定义的,所以'myController。$ scope。$ emit(/*..*/)'会引发错误。 [没有$范围注入的小提琴](https://jsfiddle.net/n7p4609r/1/)。 [使用$ scope注入的工作小提琴](https:// jsfiddle。净/ srgw8u8h/1 /) – daemonaka