2

无法使用 ControllerAsthis

任何人都可以向我解释以下情况吗?

作品

ng-controller="Parent as thus"

休息

ng-controller="Parent as this"

那个使它成为关键字的单个字母——我想要的——破坏了森林。

为什么是这样?

PS 我知道这个vm约定,但我发现它扰乱了控制器/视图模型的可移植性。

4

2 回答 2

5

问题当然在于thisJavaScript 中的保留字。控制器中没有规则作为语法说您需要将值分配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'用作名称,但它可能只会错误地导致比未定义的函数更多的错误。

于 2016-07-11T20:55:32.503 回答
0

您不能this用作实例名称。this是保留关键字。

这相当于做:

var this = new Controller();

你可以看到这是错误的。它应该是这样的:

var ctrl = new Controller();

这本质上是 angularJs 在幕后所做的事情controllerAs="Controller as ctrl"

于 2016-07-11T20:27:59.413 回答