JavaScript | Angular | Контроллер как синтаксис: нельзя использовать `this`

Невозможно использовать ControllerAs this

Может кто-нибудь объяснить мне следующий сценарий?

Работы

ng-controller="Parent as thus"

Перерывы

ng-controller="Parent as this"

Это единственное письмо, которое делает его ключевым словом - которое я хочу - разрушает лес.

Почему это?

P.S. Я знаю соглашение vm, но я нахожу, что он нарушает переносимость контроллеров/режимов просмотра.

Ответ 1

Проблема, безусловно, не, что 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' как имя, но, вероятно, это просто вызвало бы больше ошибок по ошибке, чем когда-либо undefined.

Ответ 2

Вы не можете использовать this в качестве имени экземпляра. this - зарезервированное ключевое слово.

Это будет эквивалент:

var this = new Controller();

Вы можете видеть, что это неправильно. Это должно быть что-то вроде:

var ctrl = new Controller();

Это, по сути, то, что угловое делает за кулисами, когда вы делаете controllerAs="Controller as ctrl"