JavaScript | Angular | Controller As Syntax: Cannot Use `this` JavaScript | Angular | 控制器 As 语法:无法使用 `this`

12 浏览
0 Comments

JavaScript | Angular | Controller As Syntax: Cannot Use `this` JavaScript | Angular | 控制器 As 语法:无法使用 `this`

无法使用ControllerAs this

有人可以给我解释一下下面的情况吗?

有效

ng-controller="Parent as thus"

错误

ng-controller="Parent as this"

这个单词中的一个字母使它成为一个关键字,而我想要的关键字破坏了它。

为什么会这样?

附言:我知道vm的约定,但我觉得它会破坏控制器/视图模型的可移植性。

0
0 Comments

问题的原因是在JavaScript中,this是一个保留关键字,不能作为实例名称使用。如果使用this作为实例名称,会导致语法错误。正确的做法是使用其他名称作为实例名称,如ctrl

解决方法是在Angular中使用Controller as ctrl语法。这种语法在控制器的内部定义了$scope.ctrl = this;,将当前控制器的实例赋值给$scope.ctrl。这样就可以在模板中使用ctrl来引用控制器的实例。

总结起来,当使用Angular的Controller as语法时,不能使用this作为实例名称,而是应该使用其他名称。这是因为在JavaScript中,this是一个保留关键字。解决方法是使用其他名称作为实例名称,并在控制器的内部使用$scope.ctrl = this;来引用控制器的实例。

0
0 Comments

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

在使用Angular的Controller As语法时,不能使用`this`关键字,这是因为Angular在模板表达式的上下文中保留了`this`作为关键字,用于引用表达式的当前作用域。如果在控制器中将其命名为`this`,在模板中使用`{{this}}`来引用控制器实例,将不会抛出错误,但也无法正确打印控制器实例。

这是因为Angular在作用域链中解析`this`关键字时,会找到第一个包含该属性的对象,而不是控制器实例。因此,如果在模板中使用`{{this.node}}`引用控制器的属性时,将会出现错误。解决方法是通过使用`{{this.this.node}}`来引用控制器实例,这样就可以正确打印控制器的属性。

Angular之所以保留`this`关键字作为关键字,是为了跟踪作用域。由于作用域是通过原型继承进行链接的,因此解析`this`关键字将解析为作用域链中第一个包含该属性的对象。这是作用域和实例之间的区别。

如果Angular将作用域上下文替换为控制器实例,可能会导致不清晰和复杂的行为,从而给开发人员带来许多错误和问题。例如,许多指令会创建新的作用域,具有新的`this`值。如果“this”命名的控制器也在某种程度上覆盖这些子作用域,那么就无法从内部作用域中引用控制器,例如从`ng-for`指令中。如果某个第三方库的模板使用`this`来引用其作用域(而不是控制器),那么你的控制器名称可能会破坏它。因此,Angular选择使用作用域链和`this`作为模板的上下文,以封装变化。

,尽管在使用Angular的Controller As语法时无法使用`this`关键字作为控制器名称,但这样的设计决策可以更好地封装变化,避免不必要的错误和问题。

0