我使用angular的'controller as somename'语法。
让我们说以下功能是我的控制器
function myCOntroller($scope)
{
$scope.$emit('event');
}
以上功能正常。我尝试过如下
function myController()
{
var reference = this;
reference.$emit('event');
}
这不起作用。什么时候我可以使用引用进行数据绑定。为什么我不能用它来做这类事情。我认为引用现在具有$ scope所具有的所有功能。如果$ emit以这种方式工作会不会有意义?
注意:抱歉代码示例。我只是问这个问题 概念证明,所以没有任何真实的代码。
答案 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>
使用controllerAs
,this
是控制器(不是$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>