JavaScript |角度 |控制器作为语法:不能使用“this”

JavaScript | Angular | Controller As Syntax: Cannot Use `this`

本文关键字:this 不能 语法 控制器 角度 JavaScript      更新时间:2023-09-26

不能使用 ControllerAs this

谁能向我解释以下情况?

工程

ng-controller="Parent as thus"

休息

ng-controller="Parent as this"

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

这是为什么呢?

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

问题当然在于 this 是 JavaScript 中的保留字。控制器中没有规则作为语法说您需要将 this 的值分配给与控制器同名的变量,我确信 angular 也不会做这样的事情。为什么会这样?这将是对构造函数的非常愚蠢的使用Function只是一个不必要的错误。

有一个简单的方法来测试JavaScript保留字不是这里的问题。将控制器命名为"投掷"。 "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以及不包含的内容的范围对象。

事实上,它还将包含一些对我们来说有趣的东西: 属性this: Object ,我们的控制器。

果然,将模板表达式更改为{{log(this.this)}},它将很好地记录控制器实例。不过,仍然不会使用 'this' 作为名称,它可能只会错误地导致比未定义函数更多的错误。

不能使用 this 作为实例名称。 this是一个保留关键字。

这相当于做:

var this = new Controller();

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

var ctrl = new Controller();

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