В контроллере вы устанавливаете this.name2='';
В этом случае this
не включен $scope
. Так app.name2! = '', Это равно undefined
. Обычно считается, что лучше не использовать $scope
напрямую, а использовать синтаксис ControllerAs (см. это объяснение ).
$scope
- это просто объект JavaScript, как и любой другой, но это неявная область действия всего, на что ссылается шаблон. Поэтому, если у вас есть что-то вроде ng-if="name2 == ''"
, name2 ссылается на поле в $ scope.
Когда вы используете ControllerAs, он создает объект в $ scope с таким именем ($scope.app
в вашем случае). $scope.app
соответствует this
контроллера. Это точно так же, как если бы вы поместили $scope.app = this;
в JavaScript контроллера. Итак, в контроллере вы можете установить this.name2='Harry'
и в HTML иметь:
<span> Hi {{app.name2}} </span>
И вы увидите Hi Harry
.
Однако , вы не должны использовать функцию стрелки для определения вашего контроллера, так как функции стрелки не имеют своей собственной области this
, а наследуют ее от своего родителя. Когда вы определяете функции на контроллере, используйте this.myFunc = () => {...} и обращайтесь к нему в HTML с помощью app.myFunc, но при определении самого контроллера используйте обычный function
синтаксис.
Чтобы упростить задачу, вместо использования app
в HTML и this
в контроллере, будет хорошей идеей использовать одно и то же имя, присваивая this
переменной. Обычно люди используют vm
(для View Model). Таким образом, у вас будет ControllerAs='vm'
, а затем в JavaScript установите let vm = this;
в верхней части кода вашего контроллера.
Затем вы можете ссылаться на vm.name2
(например) в и ваш HTML и ваш JavaScript.