Angular 1.5+ дополнительный компонентный односторонний привязку

Взято из документации AngularJS 1 :

Вы также можете сделать привязку необязательной, добавив ?: <? или <?attr.

Как необязательный вариант отличается от необязательного для односторонней привязки?

Мне кажется, что я вижу различия для необязательной версии двухсторонней (=) и делегировать (&) привязки здесь на моей скрипке: https://jsfiddle.net/glenn/ze2wo0s1/, но не для одностороннего.

Кстати, очень веселое Рождество! 🎅🏻🎄❤️

Ответ 1

Вы можете увидеть, как он обрабатывается в исходном коде: https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L3523.

Для меня похоже, что если вы используете <? и сделаете привязку опциональной, она рано ломается, не настраивая часы. Если использование использует < и требует его, оно устанавливает привязку к undefined и устанавливает часы. Однако, похоже, это просто просмотр undefined, поэтому на практике нет никакой разницы, кроме одного вызова recordChanges. В случае, если вы опустили обязательную привязку, требуемая привязка будет ключом в объекте changes, который передается на $onChanges при первом вызове. Однако, когда вы опускаете необязательное связывание, это не будет ключом в объекте changes.

В качестве примера см. JSFiddle. requiredBinding и optionalBinding оба опущены и, следовательно, инициализированы на undefined, но requiredBinding является ключом в объекте change, тогда как optionalBinding не является.

Ответ 2

Использование <? позволяет контроллеру изменять значение переменной, которая должна была быть привязана, только если эта переменная отсутствует.

Дополнительные привязки могут быть изменены в контроллере, когда они НЕ присутствуют. Если значение передается компоненту, то нет возможности его изменить.

Необязательные привязки не могут быть изменены вообще. Если они отсутствуют, они undefined, и они не могут быть изменены вообще.

например, предположим, что у вас есть это:

bindings: {
  nameOptional: '<?',
  nameRequired: '<'
}

В контроллере не может просто сделать $ctrl.nameRequired = 'something else' и ожидать, что представление будет обновлено. Однако может делать то же самое с nameOptional с одним условием: только если name-optional не передается компоненту. Только тогда переменная будет изменять контроллер.

Для лучшего понимания вы можете сослаться на эту скрипту.

Обратите внимание, что для упрощения вещи мы используем строку, которая передается по значению. Если вы передаете объекты, свойства объекта всегда могут быть изменены в обычных условиях.