AngularJS - альтернативное использование для изолированных выражений области видимости ("&")
Я знаю "&"
Привязка, используемая для передачи метода (выражений) в директивы, изолирует область видимости, поэтому директива сможет выполнять ее при необходимости.
Много раз мне нужно "передать" одно и то же выражение из моего основного контроллера глубиной более одного уровня во вложенную директиву (2-3 уровня). Вот почему самостоятельно, я не люблю использовать "&"
для этой цели. Для меня отправка "обратных вызовов" с помощью "="
привязки работают намного лучше. Но это не вопрос.
Вопрос в том:
Зачем я могу использовать "&"
в дополнение к прохождению функций? Могу ли я иметь что-то вроде этого: my-directive-click="clickCount +=1"
?
2 ответа
&
больше о том, чтобы позволить вам иметь дело с выражениями, и что более важно (на мой взгляд) позволяет вам помещать параметры в область видимости вызывающего родителя.
Например, если у вас есть:
scope: {
something: '&'
}
а затем в этом шаблоне директив вы можете сделать:
<select ng-model="selection" ng-change="something({$item: selection})" ...>
Вызывающий / пользователь этой директивы может получить элемент ACCESS $ в выражении, переданном something
т. е. $item помещается в область видимости.
например
<my-dir something="myOwnVar = $item + 1"></my-dir>
Вот пример этого примера, включая цепочку (множественные вложенные вызовы &
выражение): http://plnkr.co/edit/j4FCBIx0FVz4OT0w50bU?p=preview
На самом деле, &
подразумевается как односторонняя привязка данных.
Так =
является двухсторонней привязкой к данным, что означает, что изменения, внесенные в директиву, будут сохраняться в исходном объекте.
@
это просто строка.
А также &
особенный. Дело в том, что он создает метод получения вашего значения, в случае вызова функции метод фактически вызывает функцию. Я склонен делать это на DDO:
.directive('myDirective', function() {
return {
restrict: 'E',
scope: {
getParameters: '&?params'
}
Таким образом, значение, связанное с scope
является getParameters
(так что ясно, это геттер), но на элементе директивы вы будете ссылаться на него только как params
:
<my-directive params="ctrl.params">
Хотя ваш вопрос расплывчат, и, хотя вы можете сделать то, о чем просили, я думаю, что было бы лучше сделать это внутри директивы, а не так, как вы предлагали.
Я надеюсь, что это помогло.