2015-04-23 24 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