Изменить: этот ответ теперь неверен. Когда я опубликовал его, не было официального руководства по теме, но, как объясняется в ответе @ Yaroslov (отличный и правильный), это уже не так: Codelizer теперь предупреждает, а компиляция AoT не будет работать при ссылках на частные переменные в шаблонах компонентов . Тем не менее, на концептуальном уровне все здесь остается в силе, поэтому я оставлю этот ответ, поскольку он, кажется, был полезным.
Да, это ожидаемо.
Имейте в виду, что private
и другие модификаторы доступа являются конструкциями Typescript, тогда как Component / controller / template - это конструкции angular, о которых Typescript ничего не знает. Модификаторы доступа управляют видимостью между классами: создание поля private
предотвращает доступ к нему других классов , но шаблоны и контроллеры - это вещи, которые существуют внутри классов.
Технически это не так, но (вместо понимания того, как классы связаны с декораторами и их метаданными), может быть полезно думать об этом таким образом, потому что важно (ИМХО) отказаться от мышления о шаблоне и контроллере как о отдельных сущностей, чтобы думать о них как о единых частях конструкции Компонент - это один из основных аспектов ментальной модели ng2.
Рассуждая таким образом, мы, очевидно, ожидаем, что private
переменные класса компонента будут видны в его шаблоне, по той же причине, по которой мы ожидаем, что они будут видны в private
методах этого класса.