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

Не могу использовать ControllerAsthis

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

Работает
ng-controller="Parent as thus"
Перерывы
ng-controller="Parent as this"

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

Почему это?

Постскриптум Я знаю оvm соглашение, но я считаю, что это нарушает переносимость контроллеров / моделей представления.

 tymeJV11 июл. 2016 г., 22:23
Я предполагаю, что Angular пытается оценить, что передается в строке, иthis это зарезервированное слово.
 Cody11 июл. 2016 г., 22:32
С точки зрения архитектуры, это плохая практика для соединения с вашей базовой lib / framework. Как так, вы можете портировать свой универсальныйViewModel от системы к системе. Я нахожуvm подход к определенным затратам при возникновении портов. Например, если бы я взял общийCalendarViewmodel который используется для всех проектов, я должен был бы пройти через все ссылкиthis и превратить его вvm; только для этого контроллера. Это упрощенный пример, и он только один из многих. Здесь можно сказать намного больше.
 Parv Sharma11 июл. 2016 г., 22:23
но я считаю, что это мешает переносимости контроллеров / моделей представления? не могли бы вы объяснить "это"? каламбур не предназначен

Ответы на вопрос(2)

Решение Вопроса

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

 Cody11 июл. 2016 г., 23:04
Ааа! Какой красивый ответ. Спасибо большое за помощь.
 Cody11 июл. 2016 г., 23:17
Другими словами, когда я устанавливалParent as this затем{{this.node}} был сломан. Тем не мение,{{this.this.node}} работает отлично. Это разница междутранспонирования контекст разметки сas name противотображение пространства имен для свойств текущего контекста разметки. Я бы хотел, чтобы angular просто вынул контекст контекста и заменил его своим экземпляром контроллера.
 David L11 июл. 2016 г., 23:03
Хотя это, безусловно, более информативным, он по-прежнему не дает однозначного ответаЗачем AngularJS отказывается анализировать ключевое слово.
 noppa11 июл. 2016 г., 23:06
@DavidL Что заставляет вас думать, что angular не разбирает его? В приведенном выше примере angular явно анализирует выражение «Parent as this». Он просто отказывается переопределять значение словаthis в объеме шаблона. Для этого может быть много причин, от проектных решений до деталей реализации. Или вы испытываете реальные ошибки, о которых я просто не знаю?
 Cody11 июл. 2016 г., 23:31
@noppa, я думаю, ты имеешь в виду мое последнее предложение, но это просто желаемое за действительное. Я думаю, что они делают это наилучшим образом, на самом деле, чтобыинкапсулировать то, что меняется, Я думаю, что вам все еще нужно иметь цепочку scope / prototype, что, вероятно, требует наличияthis как контекст разметки. Я думаю, что мы полностью согласны;)
 noppa11 июл. 2016 г., 23:27
@ Коди, я чувствую, что там будет слишком много неясного и сложного поведения, которое вызовет множество ошибок и проблем для разработчиков. Например, множество директив создают новые области с новыми значениями дляthis, Должен ли «this» -именованный контроллер каким-то образом перекрывать и эти дочерние области? Если нет, вы не сможете обращаться к контроллеру из внутренних областей, как изнутриng-for, Если да, то что, если шаблон какой-то сторонней библиотеки используетthis ссылаться на его область (не контроллер) и имя вашего контроллера будет нарушать его. :( кажется проблематичным
 David L11 июл. 2016 г., 23:10
msgstr "это, однако, зарезервировано в контексте собственных шаблонных выражений angular". Я хочу сказать, что в идеале это утверждение должно быть подкреплено источником, демонстрирующим это. Фильтр, очевидно, применяется где-то в синтаксисе выражения, и источник для него был бы замечательным. Ваше объяснение в противном случае совершенно правильно.
 Cody11 июл. 2016 г., 23:10
@DavidL, потому что Angularрезервируетthis в качестве ключевого слова для того, чтобы отслеживать области. В качестве прицелов используютсяPrototypical Inheritanceпарсингthis разрешится к первому заданному объекту в той цепочке, которая содержит свойство. Это разница между Scope и Instance. Этоделает проанализируйте ключевое слово, но оно разрешается в непосредственную область, корневую область или что-либо между.

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

Это было бы эквивалентно выполнению:

var this = new Controller();

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

var ctrl = new Controller();

По сути, это то, что angularJs делает за сценой, когда вы делаетеcontrollerAs="Controller as ctrl"

 Cody11 июл. 2016 г., 22:37
Ну, я думаю, что Angular делает большеvar hash = {}; hash['this'] = new Controller(); - что является абсолютно законным синтаксисом. Вы действительно можете иметь переменную экземпляра, на которую ссылаются какthis.this.
 cst199202 дек. 2016 г., 11:47
Controller as ctrl внутренне определил$scope.ctrl = this; в теле контроллера.

Ваш ответ на вопрос