无法使用 ControllerAsthis
任何人都可以向我解释以下情况吗?
作品
ng-controller="Parent as thus"
休息
ng-controller="Parent as this"
那个使它成为关键字的单个字母——我想要的——破坏了森林。
为什么是这样?
PS 我知道这个vm
约定,但我发现它扰乱了控制器/视图模型的可移植性。
this
任何人都可以向我解释以下情况吗?
ng-controller="Parent as thus"
ng-controller="Parent as this"
那个使它成为关键字的单个字母——我想要的——破坏了森林。
为什么是这样?
PS 我知道这个vm
约定,但我发现它扰乱了控制器/视图模型的可移植性。
问题当然不在于this
JavaScript 中的保留字。控制器中没有规则作为语法说您需要将值分配this
给与控制器同名的变量,我很确定 angular 也不会做这样的事情。为什么会呢?那将是非常愚蠢地使用Function
构造函数并且只是一个不必要的错误。
有一种简单的方法可以测试 JavaScript 保留字不是这里的问题。将您的控制器命名为“throw”。"Parent as throw"
. throw
是保留字,但这会引发错误吗?不,这行得通吗?是的。
this
但是,在 Angular 自己的模板表达式的上下文中保留。它用于引用scope
表达式的当前值。
<div ng-controller="Parent as this">
{{log(this)}}
</div>
angular.module('testApp', []).controller('Parent', function($scope){
this.test = 'foo';
$scope.log = function(arg){
console.log(arg);
};
});
以上不会引发错误,但也不会记录控制器。相反,它将记录一个包含函数的范围对象,以及不包含的内容。log
$parent
事实上,它还会包含一些我们感兴趣的东西:property this: Object
,我们的控制器。
果然,将模板表达式更改为{{log(this.this)}}
,它将记录控制器实例就好了。虽然仍然不会'this'
用作名称,但它可能只会错误地导致比未定义的函数更多的错误。
您不能this
用作实例名称。this
是保留关键字。
这相当于做:
var this = new Controller();
你可以看到这是错误的。它应该是这样的:
var ctrl = new Controller();
这本质上是 angularJs 在幕后所做的事情controllerAs="Controller as ctrl"