На вопрос этот вопрос, как защитить [(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?





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
Надеюсь, вы поняли мою точку зрения, если возникнет какая-то путаница, дайте мне знать.
Речь идет не об 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 объясняет, что
Вы правы, я должен был это указать. Но поскольку это особый случай, я позволю ему (для целей обнаружения) и укажу случай ngModel.
Исправление к моему предыдущему комментарию: я часто использую синтаксис && с [ngModel], чтобы вернуть второе значение (так что я не должен был удивляться этому). Что меня смущает, так это то, что выражение становится ссылкой на вторую переменную, позволяя обновлять ее входным содержимым. Не знаю, как это работает.
Он возвращает переменную, поэтому с ее помощью можно создать экземпляр переменной, например let name = variable && variable.user && variable.user.name. Вот почему он работает с ngModel
Ваш пример относится к стороне «односторонней привязки» (я понимаю, что [ngModel] = "v && v.x" работает). Но как работает другая сторона двустороннего связывания? Чтобы обновить переменную входным значением, она должна сделать что-то вроде v && v.x = input.value. В обычном коде условное выражение возвращает значение второй переменной, а не саму переменную. Если это так, недопустимый пример в вопросе будет действительным.
Я не углублялся в angular, но полагаю, что, как я уже сказал, он возвращает переменную, т. Е. Это эквивалент записи variable.prop, которая работает в обоих направлениях.
Я все еще немного запутался в части назначения двусторонней привязки. Я понимаю, что
[ngModel]будет работать с условным выражением. Но когда переменная обновляется входным содержимым, разве это не работает как присваивание? Очевидно нет. Я не знаю, как связанное выражение можно использовать как переменную, которой можно присвоить.