Условное выражение, связанное с [(ngModel)]

На вопрос этот вопрос, как защитить [(ngModel)] = "currentService.user.username", когда переменная еще не определена, было дано следующее отвечать:

<input [(ngModel)] = "currentService.user && currentService.user.username">

Сначала я подумал, что это не может сработать, потому что связанное выражение не будет допустимой левой частью в присваивании:

(this.currentService.user && this.currentService.user.username) = "Bob"; // Not valid

Однако Пардип Джайн предоставил демонстрацию, которая показала, что она действительно работает: переменная currentService.user.username привязывается к элементу ввода после того, как она определена. Этот stackblitz - это разветвленная версия его демо.

Мой вопрос: должно ли таким образом связываться условное выражение с [(ngModel)], или оно работает только «случайно» и может перестать работать в будущих версиях Angular?

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
0
3 548
2

Ответы 2

IMO, выражение привязки данных правильное здесь, в строке ниже -

<input [(ngModel)] = "currentService.user && currentService.user.username">

Потому что, когда вы связываете ngModel с таким выражением (currentService.user && currentService.user.username), за сценой он будет проверьте первое значение, и как только оно будет доступно, оно будет искать второе значение, если существует угловой свяжет ваше значение с этим ngModel, иначе свяжет с первым.

(this.currentService.user && this.currentService.user.username) = "Bob"; // Not valid

Это недопустимый синтаксис, потому что здесь вы присваиваете значение некоторой переменной, которую вам нужно строго описать. Я имею в виду либо this.currentService.user.username, либо this.currentService.user, не использующие разделитель &&.

Но да, если вы напишете так

this.bob = this.currentService.user && this.currentService.user.username // will be valid - here this.bob is some variable

Надеюсь, вы поняли мою точку зрения, если возникнет какая-то путаница, дайте мне знать.

Я все еще немного запутался в части назначения двусторонней привязки. Я понимаю, что [ngModel] будет работать с условным выражением. Но когда переменная обновляется входным содержимым, разве это не работает как присваивание? Очевидно нет. Я не знаю, как связанное выражение можно использовать как переменную, которой можно присвоить.

ConnorsFan 18.05.2018 15:51

Речь идет не об Angular, а о JS.

Взгляните на этот фрагмент:

const variable = {
  user: {
    name: 'John Doe'
  }
};

console.info(variable);
console.info(variable.user);
console.info(variable.secondUser);
console.info(variable.user.name);
console.info(variable.secondUser.name);

Как видите, он проверяет, определены ли переменные. Когда вы пытаетесь получить доступ к свойству переменной undefined, выдается ошибка.

Что происходит в вашем случае, так это то, что если первое условие пропущено, другие условия не проверяются.

Взгляните на этот фрагмент:

const variable = {
  user: {
    name: 'John Doe'
  }
};

console.info(variable && variable.user && variable.user.name);
console.info(variable && variable.user && variable.user.surname);
console.info(variable && variable.secondUser && variable.secondUser.name);

На этот раз ошибок не возникает. Этому меня научил вопрос о переполнении стека.

Второй момент, оператор &&возвращает значение последнего выражения, если это выражение является правдивым или ложным. Взгляните на этот фрагмент:

const variable = {
  user: {
    name: 'John Doe'
  }
};

console.info(variable && variable.user && variable.user.name);
console.info(variable && variable.user && variable.user.surname);
console.info(variable && variable.user && !!variable.user.name);
console.info(variable && variable.user && !!variable.user.surname);

Как видите, если последнее условие не является логическим, оно вернет значение условия.

Кстати, в Angular вы можете использовать Оператор Элвиса, что позволяет сократить синтаксис (но вы не можете использовать его в формах, управляемых шаблонами):

<input *ngIf = "currentService?.user?.username">

А также, MDN объясняет, что

user4676340 18.05.2018 14:30

Вы правы, я должен был это указать. Но поскольку это особый случай, я позволю ему (для целей обнаружения) и укажу случай ngModel.

user4676340 18.05.2018 15:27

Исправление к моему предыдущему комментарию: я часто использую синтаксис && с [ngModel], чтобы вернуть второе значение (так что я не должен был удивляться этому). Что меня смущает, так это то, что выражение становится ссылкой на вторую переменную, позволяя обновлять ее входным содержимым. Не знаю, как это работает.

ConnorsFan 18.05.2018 15:59

Он возвращает переменную, поэтому с ее помощью можно создать экземпляр переменной, например let name = variable && variable.user && variable.user.name. Вот почему он работает с ngModel

user4676340 18.05.2018 16:03

Ваш пример относится к стороне «односторонней привязки» (я понимаю, что [ngModel] = "v && v.x" работает). Но как работает другая сторона двустороннего связывания? Чтобы обновить переменную входным значением, она должна сделать что-то вроде v && v.x = input.value. В обычном коде условное выражение возвращает значение второй переменной, а не саму переменную. Если это так, недопустимый пример в вопросе будет действительным.

ConnorsFan 18.05.2018 16:35

Я не углублялся в angular, но полагаю, что, как я уже сказал, он возвращает переменную, т. Е. Это эквивалент записи variable.prop, которая работает в обоих направлениях.

user4676340 18.05.2018 20:21

Другие вопросы по теме